asp.net-mvc – ASP.NET MVC 4 – 嵌套模型 – 如何设置正确的关
我是从Rails的背景来到asp.net MVC 4,我在弄清楚如何处理嵌套模型时遇到了一些麻烦.
我正在使用Entity Framework 4.3和CodeFirst方法. 应用程序非常简单,并且有一个Set模型 – 它有许多特许经营权.它有一个特许经营模式 – 属于集合. POCO类与适当的导航属性一起创建,然后我用视图搭建控制器,然后生成数据库. 以下是课程: 组 namespace FranchiseManagerTest.Models { public class Set { [Key] public int SetID { get; set; } public string SetName { get; set; } public string MainAddress { get; set; } public string TimeZone { get; set; } public virtual ICollection<Franchise> Franchises { get; set; } } } 特许经营 namespace FranchiseManagerTest.Models { public class Franchise { [Key] public int FranchiseID { get; set; } public int SetID { get; set; } public string FranchiseName { get; set; } public string FranchiseNumber { get; set; } public virtual Set Set { get; set; } } } 然后我创建了一些测试特许经营集和特许经营权. 这是主要观点: 该项目要求所有与集合相关的特许经营权在相应的集合中可见.此外,我需要能够在Set的详细信息中添加特许经营权. 我创建了一个截图,以说明在主视图上单击“详细信息”后的样子: New Franchise按钮是使用如下所示的ActionLink创建的: @Html.ActionLink("New Franchise","Create","Franchise",null,new { @class = "btn btn-large btn-primary" }) 这将我带到Franchise Create页面,如下所示: 正如您所看到的,问题是应该包含相关Set Model的下拉列表未预先填充 – 而是我必须单击下拉列表并重新选择我已经在的Set. 正在填充下拉列表 – 但是所有现有的集合 – 而不是我所在的集合. 这是我点击它时的下拉列表: 在特许经营创建视图内,这是下拉列表及其标签的样子: <div class="editor-label"> @Html.LabelFor(model => model.SetID,"Set") </div> <div class="editor-field"> @Html.DropDownList("SetID",String.Empty) @Html.ValidationMessageFor(model => model.SetID) </div> 这是我尝试过的: 我尝试使用ActionLink将SetID值传递给View: @Html.ActionLink("New Franchise",Model.SetID,new { @class = "btn btn-large btn-primary" }) 然后我尝试将Create View的String.Empty属性更改为: <div class="editor-label"> @Html.LabelFor(model => model.SetID,"Set") </div> <div class="editor-field"> @Html.DropDownList("SetID",Model.SetID) @Html.ValidationMessageFor(model => model.SetID) </div> 但是,这不起作用并生成无效参数错误. 这是一个可能的线索(或另一个问题?) 当我从我所在的关联集访问Create Franchise View时,URL就是这样的: 我假设如果Set和Franchise之间的关联是正确的,当我去Set中添加特许经营权时,URL将如下所示: localhost:52987/Set/1/Franchise/Create 这是一个错误的假设 – 这可能在.NET MVC中做到吗? 任何建议都非常感谢! EDITS 以下是我的Global.asax文件中的路由,如果这有用: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapHttpRoute( name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional } ); routes.MapRoute( name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Set",action = "Index",id = UrlParameter.Optional } ); } 正如所要求的 – 这里是特许经营控制器的GET和POST Create方法: // // GET: /Franchise/Create public ActionResult Create() { ViewBag.SetID = new SelectList(db.Sets,"SetID","SetName"); return View(); } // // POST: /Franchise/Create [HttpPost] public ActionResult Create(Franchise franchise) { if (ModelState.IsValid) { db.Franchises.Add(franchise); db.SaveChanges(); return RedirectToAction("Index"); } ViewBag.SetID = new SelectList(db.Sets,"SetName",franchise.SetID); return View(franchise); } 如果有更多代码有用,请告诉我. 解决方法
我对你想做什么感到有点困惑,但我建议你做一些改变:
我改变了这个: <div class="editor-label"> @Html.LabelFor(model => model.SetID,"Set") </div> <div class="editor-field"> @Html.DropDownList("SetID",Model.SetID) @Html.ValidationMessageFor(model => model.SetID) </div> 对此: <div class="editor-label"> @Html.LabelFor(model => model.SetID,"Set") </div> <div class="editor-field"> @Html.DropDownListFor(model => model.SetID,(SelectList)ViewBag.FranchiseSets) @Html.ValidationMessageFor(model => model.SetID) </div> 如果将SetID值传递给Create ActionMethod并分配它,它应该传递给视图.看起来您没有填充DropDownList,因此选择列表中没有选项可供选择. public ActionResult Create(int SetID) { ViewBag.FranchiseSets = new SelectList(...); var franchise = new Franchise { SetID = SetID }; return View(franchise); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |