asp.net-mvc-3 – MVC3强类型的局部视图模型绑定

我有一个强类型视图Edit,名为OrderModel的模型.在此视图中,我使用的是一个强类型的局部视图,其中包含一个名为OrderTypeModel的模型.部分视图_OrderTypeAutoComplete,包含 jqueryui自动完成文本框.如果我使用此代码渲染视图,

public ActionResult Edit(){
    return View();
}

我的编辑视图包含以下Razor标记

<div class="editor-field">
    @Html.Partial("_OrderTypeAutoComplete")
    @Html.HiddenFor(model => model.OrderTypeID)
    @Html.ValidationMessageFor(m => m.OrderTypeID)
</div>

我的部分视图包含此剃刀标记

@{
    Layout = null;
}
<script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
@Html.AutoCompleteFor(model => model.OrderTypeID,x =>  x.OrderType,"Items","Orders")

当我渲染这个时,一切都很棒,我的自动完成效果很好(使用自动完成扩展).无论如何,我需要在我的初始OrderModel中初始化一些东西,所以我将控制器中的代码更改为此.

public ActionResult Edit(){
    return View(OrderService.GetInitializedOrderModel()); //returns a new OrderModel
}

现在,当我渲染视图时,我得到了异常:
传递到字典中的模型项的类型为“Testing.Models.OrderModel”,但此字典需要“Testing.Models.OrderTypeModel”类型的模型项.

在我看来这一行
    @ Html.Partial( “_ OrderTypeAutoComplete”)

当我没有提供OrderModel时,似乎Razor引擎将为视图创建OrderModel,并为部分视图创建OrderTypeModel.这将得到相同的结果.

public ActionResult Edit(){
    return View(new OrderModel())
}

我是MVC的新手,所以我不确定这里发生了什么.我只是想在OrderModel模型中为我的视图提供一些简单的下拉值,这些值足够小,我不需要jquery回发来获取.这就是我在我的模型中为Http Get on my Edit操作初始化的值.

任何帮助,将不胜感激.谢谢.

解决方法

示例中缺少模型类的类定义,所以我无法确切地知道发生了什么,但……

@Html.Partial() method有一些重载:

@Html.Partial(string)
@Html.Partial(string,Object)
@Html.Partial(string,ViewDataDictionary)
@Html.Partial(string,Object,ViewDataDictionary)

前三个重载都只是最后一个的“别名” – 当所有的说完成时它是被调用的最后一个.

当您调用@ Html.Partial(字符串)并且不传递模型值或ViewDataDictionary时,ASP.NET MVC将仅传递当前视图的ViewDataDictionary(即this.ViewData).

换句话说,打电话给:

@Html.Partial(string)

基本上相当于:

@Html.Partial(string,this.ViewData)

…在您的情况下,this.ViewData的类型为OrderModel,而不是OrderModelType.

相关文章

引言 本文从Linux小白的视角, 在CentOS 7.x服务器上搭建一个...
引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要...
一. 宏观概念 ASP.NET Core Middleware是在应用程序处理管道...
背景 在.Net和C#中运行异步代码相当简单,因为我们有时候需要...
HTTP基本认证 在HTTP中,HTTP基本认证(Basic Authenticatio...
1.Linq 执行多列排序 OrderBy的意义是按照指定顺序排序,连续...