【问题标题】:How to update ViewData using TrypUpdateModel in mvc2如何在 mvc2 中使用 TrypUpdateModel 更新 ViewData
【发布时间】:2011-06-23 20:32:36
【问题描述】:

我的视图填充了模型属性,并且一些下拉列表是硬编码的,并通过 viewdata 传递给视图,问题是 Trupdatemodel 仅更新模型值,我无法更新 viewdata 值,下面是更新的代码模型但不是 vidata 下拉列表:

查看:

<div class="editor-field">
                    <% if (ViewBag.mode != "edit")
                       { %>
                    <%: Html.TextBoxFor(model => model.Date)%>
                    <%}else{%>
                        <%: Html.TextBoxFor(model => model.Date, new { @Value = Model.Date.ToShortDateString() })%>
                    <%} %>
                    <%: Html.ValidationMessageFor(model => model.Date) %>
                </div></td></tr><tr><td>Experience level</td><td><div class="editor-field">
                    <%: Html.DropDownListFor(model => model.ExperienceLevelID, (SelectList)ViewData["Experience"], "--select--")%>
                    <%: Html.ValidationMessageFor(model => model.ExperienceLevelID) %>
                </div></td></tr>

                 <tr><td>No of Attendees</td><td><div class="editor-field">

              <%-- <%: Html.DropDownList("attendees1", (SelectList)ViewData["attendees1"], "--select--")%>--%>
               <% if (ViewBag.mode != "edit")
                  { %>

                <%: Html.DropDownList("attendees1", ViewData["attendees1"] as SelectList, "--select--")%>
               <%}else{%>
               <%: Html.DropDownList("attendees1")%>
               <%} %>
                &nbsp;&nbsp; <label>£</label>&nbsp;<%: Html.TextBox("attendeeCost", ViewData["txtAttendees"], new { maxlength = "5", style = "width:40px;" })%> <label>Price/Unit</label>
                </div></td></tr>

                <tr><td>Second Driver</td><td> <div class="editor-field">

                    <label>£</label>&nbsp;<%: Html.TextBoxFor(model => model.SecondDriverPrice, new { maxlength = "5", style = "width:40px;" })%> <label>Price</label>
                    &nbsp;&nbsp; <%: Html.CheckBoxFor(model => model.SecondDriver) %><label>Free</label>
              </div></td></tr>

                <tr><td>No of Helmets</td><td><div class="editor-field">
               <% if (ViewBag.mode != "edit")
                  { %>
               <%: Html.DropDownList("helmets", ViewData["size"] as SelectList, "--select--")%>
               <%}else{%>
                <%: Html.DropDownList("helmets", "--select--")%>
               <%} %>
                &nbsp;&nbsp; <label>£</label>&nbsp;<%: Html.TextBox("unitCosthelmet", ViewData["txtHelmet"], new { maxlength = "5", style = "width:40px;" })%> <label>Price/Unit</label>
                </div></td></tr>

控制器:

 [HttpPost]
    public ActionResult Edit(int id, FormCollection collection)
    {


        ViewBag.mode = "edit";

        // for dropdown track
        ITrackRepository trackResp = new TrackRepository();
        IQueryable<Object> tracks = trackResp.GetVenuesSelectlist();
        ViewData["Venue"] = new SelectList(tracks, "VenueID", "Name");

        // for dropdown for event type
        ITrackdayRepository trackdayResp = new TrackdayRepository();
        IQueryable<EventType> eventTypes = trackdayResp.GetAllEventTypes();
        ViewData["EventTypes"] = new SelectList(eventTypes, "ID", "Name");

        // for dropdown experience
        IExperienceLevelRepository expLevelResp = new ExperienceLevelRepository();
        IQueryable<ExperienceLevel> expLevel = expLevelResp.GetAllExperienceLevels().OrderBy(ExperienceLevel => ExperienceLevel.Name);
        ViewData["Experience"] = new SelectList(expLevel, "ID", "Name");

        // dropdown for helmets
        IProductRepository helmetResp = new ProductRepository();
        Product productHelmet = helmetResp.GetProd(id);

        var attendeesList = Enumerable.Range(1, 80).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() });
        ViewData["attendees1"] = new SelectList(attendeesList.ToList(), "Value", "Text");


        // dropdown for helmets 
        var helmetsList = Enumerable.Range(1, 200).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() });
        ViewData["helmets"] = new SelectList(helmetsList.ToList(), "Value", "Text");

        //ViewBag.helmet = new SelectList(helmets.ToList(), "Value", "Text", product.QtyAvailable);

        // dropdown for garages
        var garagesList = Enumerable.Range(1, 50).Select(x => new SelectListItem { Value = x.ToString(), Text = x.ToString() });
        ViewData["garages"] = new SelectList(garagesList.ToList(), "Value", "Text");

        Event trackday = trackdayResp.GetEvent(id);

        TryUpdateModel(trackday, collection);


        if (ModelState.IsValid)
        {
           // product.DateModified = DateTime.Now;
            trackday.DateModified = DateTime.Now;
            TempData["msg"] = trackdayResp.Save().ToString();
            helmetResp.Save();
            return RedirectToAction("Index");
        }
        else
        {
            return View("Create");
        }


    }

【问题讨论】:

  • 顾名思义,如果可以,TryUpdateModel 会更新模型。 ViewData 只是视图需要,不需要更新
  • 我需要更新通过视图数据填充的编辑菜单中的选定列表
  • 例如在编辑视图中,如果用户从参加者列表中选择参加者,它应该像为模型所做的那样更新数据库

标签: asp.net-mvc asp.net-mvc-2 viewdata


【解决方案1】:

您需要在模型中为TryUpdateModel 更新要更新的数据,以更新这些值。如果您只是将它们放在 ViewData 中,则数据只会传递给视图,并且控制器无法使用 TryUpdateModel 更新这些值。

您需要将当前位于 ViewData 中的选择列表数据包含到 Event 对象中,或者创建一个包含您要更新的值的对象。然后使用TryUpdateModel 将使用发布的值更新该数据。当您创建此新对象或将其添加到 Event 时,强烈键入您对该对象的视图,这样您就不需要在视图中执行 ViewData 转换。

【讨论】:

  • 你能给我举个例子吗..我确实尝试为所有硬编码的下拉列表创建一个自定义类型视图模型,但是失败了:(
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2014-07-12
  • 2010-10-07
  • 2011-06-22
  • 1970-01-01
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多