6

我从 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 如下所示:

在此处输入图像描述

我假设如果SetFranchise之间的关联是正确的,并且当我在 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);
    }

只要让我知道更多代码是否会有所帮助。

4

2 回答 2

3

我对您要做什么感到有些困惑,但我建议进行一些更改:

我会改变这个:

<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);
}
于 2012-06-21T20:57:12.030 回答
1

目前尚不清楚您的操作和路线是如何设置的,但您可能想试试这个:

@Html.ActionLink("New Franchise", "Create", "Franchise", new{Model.SetID},  new { @class = "btn btn-large btn-primary" })

通过创建具有SetID属性的对象,MVC 将知道该参数应该命名为“SetID”。

PS-我可以建议重命名Set为 (FranchiseSetFranchiseGroup等),以避免命名冲突吗?Set 是英语中最模棱两可和最常见的词之一。

于 2012-06-21T17:59:25.930 回答