我从 Rails 的背景来到 asp.net MVC 4,我在弄清楚如何处理嵌套模型时遇到了一些麻烦。
我正在使用带有 CodeFirst 方法的 Entity Framework 4.3。
该应用程序相当简单,并且有一个Set模型 - 它有许多Franchises。它有一个特许经营模式 - 属于 Sets。
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 相关的所有特许经营权在相应的 Set 中可见。此外,当我在 Set 的详细信息中时,我需要能够向 Set 添加特许经营权。
我创建了一个屏幕截图来说明单击主视图上的“详细信息”后的样子:
New Franchise按钮是使用如下所示的 ActionLink 创建的:
@Html.ActionLink("New Franchise", "Create", "Franchise", null, new { @class = "btn btn-large btn-primary" })
这会将我带到如下所示的 Franchise Create 页面:
如您所见,问题在于未预先填充应包含相关集模型的下拉列表 - 相反,我必须单击下拉列表并重新选择我已经在其中的集。
下拉列表正在填充 - 但由所有现有的集合 - 而不是我所在的集合。
这是我单击它时的下拉列表:
在Franchise Create View内部,下拉列表及其标签如下所示:
<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值传递给视图:
@Html.ActionLink("New Franchise", "Create", "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 中添加 Franchise 时,URL 将如下所示:
localhost:52987/Set/1/Franchise/Create
这是一个错误的假设吗 - 这可能在 .NET MVC 中实现吗?
非常感谢这里的任何建议!
编辑
如果这有帮助,这是我的 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, "SetID", "SetName", franchise.SetID);
return View(franchise);
}
只要让我知道更多代码是否会有所帮助。