代码之家  ›  专栏  ›  技术社区  ›  Tobiasopdenbrouw

在MVC中,一个编辑httppost工作,另一个不工作。我缺少什么?

  •  2
  • Tobiasopdenbrouw  · 技术社区  · 14 年前

    一般的谷歌搜索对我没有帮助,所以:

    我正在从头开始构建我的第一个MVC应用程序, MVC Music Store example 但是取而代之的是构建一个小的应用程序,在那里可以创建和制造竞技场斗士来互相战斗。( Fighters Fight 已通过ef链接到基础表)。

    我有两个控制器 战斗机 以及 Fights . 编辑 Actionresult 对于 打架 正在工作,但是 战斗机 不是这样。当我点击保存修改的按钮时,我会返回到相关的索引页,但是没有提交任何修改。这是我的问题:为什么失败了?

    拦污栅控制器 ,错误的未更新httppost edit(应命名为fightercontroller,但不命名为neverthemind):

            //
            // GET: /Barracks/Edit
            public ActionResult Edit(int id)
            {
                ViewData.Model = _FightDb.Fighters.Single(f => f.Id == id);
                return View();
            }
    
    
            //
            // POST: /Barracks/Edit
            [HttpPost]
            public ActionResult Edit(int id, FormCollection collection)
            {
                var fighter = _FightDb.Fighters.Single(f => f.Id == id);
    
                try
                {
                    UpdateModel(fighter, "Fighter");
                    var x = ViewData.GetModelStateErrors();
                    _FightDb.SaveChanges();
    
                    return RedirectToAction("Index");
                }
                catch
                {
                    var viewModel = fighter;
    
                    return View(viewModel);
                }
    
            }
    

    (如你所见,我已经包括了 the GetModelStateErrors trick from this SO question ,但x的结果是 null )

    这是可以工作的控制器,FightController:

       //
            // GET: /Fights/Edit
            public ActionResult Edit(int id)
            {
                var viewModel = new FightDetailsViewModel
                {
                    Fight = _FightDb.Fights.Single(f => f.ID == id),
                    Fighters = _FightDb.Fighters.ToList()
                };
    
                return View(viewModel);
            }
    
            //
            // POST: /Fights/Edit
            [HttpPost]
            public ActionResult Edit(int id, FormCollection collection)
            {
                var fight = _FightDb.Fights.Single(f => f.ID == id);
    
                try
                {
                    UpdateModel(fight, "Fight");
                    _FightDb.SaveChanges();
    
                    return RedirectToAction("Index");
                }
                catch
                {
                    var viewModel = new FightDetailsViewModel
                    {
                        Fight = _FightDb.Fights.Single(f => f.ID == id),
                        Fighters = _FightDb.Fighters.ToList()
                    };
    
                    return View(viewModel);
                }
            }
    

    这是战斗机的edit.aspx: (评论后编辑)

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Mvc3_EF_BW_Fight.Models.Fighter>" %>
    
    
    <asp:Content ID="Content1" ContentPlaceHolderID="cphMain" runat="server">
        <h2>Edit</h2>
    
            <%: Html.EditorForModel()  %>
    
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    

    共享中使用以下fighter.ascx:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc3_EF_BW_Fight.Models.Fighter>" %>
    <% using (Html.BeginForm())
       {%>
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>Fighter</legend>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Id) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Id) %>
            <%: Html.ValidationMessageFor(model => model.Id) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.FighterName) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.FighterName) %>
            <%: Html.ValidationMessageFor(model => model.FighterName) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.FighterStyleDescription) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.FighterStyleDescription) %>
            <%: Html.ValidationMessageFor(model => model.FighterStyleDescription) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.FighterLongDescription) %>
        </div>
        <div class="editor-field">
            <%: Html.TextAreaFor(model => model.FighterLongDescription) %>
            <%: Html.ValidationMessageFor(model => model.FighterLongDescription) %>
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
    <% } %>
    

    这是用于战斗的edit.aspx

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Mvc3_EF_BW_Fight.ViewModels.FightDetailsViewModel>" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="cphMain" runat="server">
    
        <h2>Edit</h2>
        <%: Html.EditorFor(model => model.Fight, new { Fighters = Model.Fighters })%>
    
    </asp:Content>
    
    <asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server">
    </asp:Content>
    

    这就是战斗。ascx:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Mvc3_EF_BW_Fight.Models.Fight>" %>
    <% using (Html.BeginForm())
       {%>
    <%: Html.ValidationSummary(true) %>
    <fieldset>
        <legend>Fields</legend>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.ID) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.ID) %>
            <%: Html.ValidationMessageFor(model => model.ID) %>
        </div>
    
    
        <div class="editor-label">
            <%: Html.LabelFor(model => model.FightName) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.FightName) %>
            <%: Html.ValidationMessageFor(model => model.FightName) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Fighter1ID) %><br />
            <%: Html.LabelFor(model => model.Fighter1Reference.Value.FighterName)%>
        </div>
        <div class="editor-field">
            <%: Html.DropDownList("Fighter1ID", new SelectList(ViewData["Fighters"] as IEnumerable, "ID", "FighterName", Model.Fighter1ID))%>
            <%: Html.ValidationMessageFor(model => model.Fighter1ID) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Fighter2ID) %>
        </div>
        <div class="editor-field">
            <%: Html.DropDownList("Fighter1ID", new SelectList(ViewData["Fighters"] as IEnumerable, "ID", "FighterName", Model.Fighter1ID))%>
            <%: Html.ValidationMessageFor(model => model.Fighter2ID) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Fighter1Login) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Fighter1Login) %>
            <%: Html.ValidationMessageFor(model => model.Fighter1Login) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.Fighter2Login) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Fighter2Login) %>
            <%: Html.ValidationMessageFor(model => model.Fighter2Login) %>
        </div>
        <div class="editor-label">
            <%: Html.LabelFor(model => model.FightStatusID) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.FightStatusID) %>
            <%: Html.ValidationMessageFor(model => model.FightStatusID) %>
        </div>
        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
    <% } %>
    

    这是我的战斗模型:

    public class FightDetailsViewModel
    {
        public Fight Fight { get; set; }
        public List<Fighter> Fighters { get; set; }
    }
    

    没有战斗机的视图模型(无论如何,这个场景中没有涉及的视图模型)。

    我可以发布任何你想看到的代码。

    编辑:我看过 Using ViewModel Pattern with MVC 2 Strongly Typed HTML Helpers ASP.NET MVC 2 UpdateModel() is not updating values in memory or database 但是我还没有看到解决方案。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community CDub    8 年前

    而不是这个 UpdateModel(fighter, "Fighter"); 尝试像这样调用updte模型 UpdateModel(fighter); . 区别在于两种编辑,如果是战斗机,你的模型是直接的战斗机,所以你不需要名字,而如果是战斗,你叫编辑模型。战斗,所以你需要名字。也可以看到这个问题: asp.net mvc2 - how to get model and model.something in the same way in controller?