【问题标题】:HttpPost Edit Action for updating my model用于更新我的模型的 HttpPost 编辑操作
【发布时间】:2011-03-18 17:40:15
【问题描述】:

我尝试创建一个 asp.net mvc3 应用程序。

这是我的看法:

@model Iads.Elrams.Data.Entities.Page
@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <div class="formElement">
            <div class="formFieldLabel">
                @Html.LabelFor(model => model.ExternalLink)
            </div>
            <div class="formField">
                @Html.TextBoxFor(model => model.ExternalLink, new { style = "width:400px" })
            </div>
        </div>
    <div class="border content">
        <div id="tabs" style="margin-top: 20px;"> <!-- jquery UI -->
            <div class="tabMenu"> 
                <ul>
                    @foreach (Iads.Elrams.Data.Entities.Language lang in ViewBag.Languages) {
                        <li><a href="#@lang.Iso2">@lang.Name</a></li>
                    }
                </ul>
            </div>
            @{
                foreach (Data.Entities.Language lang in ViewBag.AvailableLanguages) {
                    <div id="@lang.Iso2" class="border tabMenuContent">
                        <div class="formElement">
                            <div class="formFieldLabel">
                                @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title) * <!-- Object: PageText -->
                            </div>
                            <div class="formField">
                                @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).Title, new { style = "width:400px" })
                            </div>
                        </div>
                        <div class="formElement">
                            <div class="formFieldLabel">
                                @Html.LabelFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText) *
                            </div>
                            <div class="formField">
                                @Html.EditorFor(model => model.GetTextOrDefaultByLang(lang.Iso2).NavText, new { style = "width:400px" })
                            </div>
                        </div>
                    </div>
                }
            }
        </div>
        <p>
            <input type="submit" value="save" class="button" />
            <input type="button" class="lightbutton" value="cancel" onclick="location.href = '@Url.RouteUrl(new RouteValueDictionary(new {
                    area = "Cms",
                    controller = "Page",
                    action = "Index"
                }))';" />
        </p>
    </div>
}

这里是我的页面控制器:


public ActionResult Edit(int id) {
    Page page = pageRepository.GetById(id);
    if(page == null)
        return new HttpNotFoundResult();

    IEnumerable languages = languageRepository.GetAll();
    languages = languages.OrderBy(m => m.LanguageId);
    ViewBag.AvailableLanguages = languages;
    return View(page);
}

[HttpPost]
public ActionResult Edit(what are the parameters???) {
    // ?????
    return View(page);
}

我希望将页面作为参数,但这不适用于 PageTexts!

我的参数是什么?我的方法应该如何?

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 是否通过表单发布?
  • 是的,它是通过管理控制面板中的表单发布的
  • 默认模型绑定器不应该处理这个吗?在这种情况下: public ActionResult Edit(Iads.Elrams.Data.Entities.Page page)
  • 没有,因为有 x 个 PageTexts(每种语言一个)。它处理的页面属性,但不是 PageText 列表的属性。

标签: c# asp.net asp.net-mvc asp.net-mvc-3 razor


【解决方案1】:

我认为在您的情况下,您可以将参数设为Iads.Elrams.Data.Entities.Page。您也可以将其设为 FormCollection 并以这种方式获取请求项。

这是我做过的几个更新类型方法:

<HttpPost()>
Function Transfer(ByVal collection As FormCollection)
...
End Function

<HttpPost()>
Function Update(ByVal visit As VisitSummaryViewModel)
...
End Function

【讨论】:

  • 但如果我至少有两种可用的语言,它们具有相同的名称和 ID(标题和导航文本)。那么我该如何处理这些领域呢?我如何阅读这些字段?
  • 我没有在 MVC 中尝试过这个,但是在经典的 ASP 项目中,具有相同标签的项目会以数组的形式进入页面。尝试通过 formscollection 访问。即集合["Title"][0].
【解决方案2】:

您可以使用 FormCollection 并处理键值对,但这不是一个优雅的解决方案。我建议使用与Iads.Elrams.Data.Entities.Page 不同的单独视图模型类,然后您可以使用 AutoMapper 之类的库来帮助您映射值。视图模型和您的数据库模型可能有很大差异,您可以通过设计不同的类(验证、自定义逻辑等)获得更大的灵活性。

在您的情况下,我将创建一个 PageViewModel 类,其中包含 PageLanguageViewModel 类的集合。此外,在视图中,我将使用“for (i = 0; ... )”循环,以便 html 输入扩展方法将为该集合创建适当的名称和 ID。您的 post 参数将是 PageViewModel 类的一个实例。 ASP.NET Mvc 模型绑定也适用于集合类型。但是,在视图中动态删除或添加项目时有一个技巧,因为您必须维护正确的索引。

【讨论】:

    【解决方案3】:
    //
    // GET: /controllername/Edit/
    public ActionResult Edit()
    {
        var langer = from lang in globalizationdb.langs select langs;
        ViewData["listlang"] = langer;
    }
    
    //
    // POST: /controllername/Edit/
    [HttpPost]
    public ActionResult Edit(int id, FormCollection collection) {
                    //dbcontext   //dbname            //id field
    var languages = globalizationdb.lang.Where(x => x.lang_id == id).Single();
    
       long langish = Convert.ToInt64(collection["langfield"]);
       //get the lang id , im asuming u gonna use dropdownlist for lang...
       lang.lang_id = langish;
    
       //dbcontext 
       globalizationdb.SubmitChanges();
       return RedirectToAction("Index");
    }
    

    也在查看 ///控制器名称应该没有blabla“Controller”,就像CatController应该是Cat only..

    @using (Html.BeginForm("Edit", "yourControllername", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <div class="editor-label">Lang ID</div>
        <div class="editor-field">
            //lang field as dropdownlist
            @Html.DropDownList("langfield", new SelectList((System.Collections.IEnumerable)ViewData["listlang"], "lang_id", "lang_name",Model.lang))
            @Html.ValidationMessageFor(model => model.lang_id)
        </div>
    }
    

    在表单启动时使用FormMethod.Post, new { enctype = "multipart/form-data" } 后,您可以使用FormCollection 方法。

    你也可以将它用于你自己制作的数据库..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2012-07-30
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多