加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC 4 – 嵌套模型 – 如何设置正确的关

发布时间:2020-12-16 03:27:38 所属栏目:asp.Net 来源:网络整理
导读:我是从Rails的背景来到asp.net MVC 4,我在弄清楚如何处理嵌套模型时遇到了一些麻烦. 我正在使用Entity Framework 4.3和CodeFirst方法. 应用程序非常简单,并且有一个Set模型 – 它有许多特许经营权.它有一个特许经营模式 – 属于集合. POCO类与适当的导航属性
我是从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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读