问题:我们有一个主视图和一些部分视图。一切都使用与主视图相同的模型。在提交主视图时,我试图渲染局部视图并尝试传递模型,但只有传递下来的属性是页面或视图上的可编辑字段。我怎样才能传递其他属性?
当前解决方法:部分视图也需要其他数据来生成电子邮件正文,但由于它没有传递下来,我们正在创建隐藏字段以将其传递下来。
主视图
@using (Ajax.BeginForm("CommonSave", "Common", null, new AjaxOptions
{
HttpMethod = "Post",
InsertionMode = InsertionMode.Replace,
//OnSuccess = "submitFormSuccess",
//OnFailure = "submitFormFailure"
}, new { id = "commonForm" }))
{
<div>
<table>
<tr>
<td>
@Html.EditorFor(m => m.Name)
</td>
</tr>
<tr>
<td>
<input type ="submit" name="Common Save" />
</td>
</tr>
</table>
</div>
控制器:
public class CommonController : Controller
{
public ActionResult Index()
{
CommonModel model = new CommonModel()
{
Id = 3,
Name = "Test Name"
};
return View("Common", model);
}
[HttpPost]
public ActionResult CommonSave(CommonModel model)
{
return PartialView("CommonPartial", model);
}
public bool BinderSave(CommonModel model)
{
return true;
}
}
在调用主视图(Common)Index
时加载。
在主视图上提交Ajaxform后,将调用actionmethod CommonSave
,但传递给CommonSave
的模型仅包含Name
而不包含Id
。
我们如何在不创建隐藏字段或做任何事情的情况下将其传递下去? 我的实际模型有很多需要传递的字段。
答案 0 :(得分:0)
而不是使用ajax表单我会使用ajax调用并在成功时填充字段。将按钮更改为按钮而不是提交
<input type ="button" class="btnSubmit" name="Common Save" />
然后在你的脚本标签
中$('.btnSubmit').click(function () {
$.ajax({
url: '@Url.Action("CommonSave", "CommonController")',
type: "POST",
data: { Id: $('.Id').val() }
cache: false,
async: true,
success: function (result) {
//put the partial into a div on the form
$(".commonForm").html(result);
//now set the fields on the partial from the model
$('#EmailName').val('@Model.EmailName');
}
});
});
答案 1 :(得分:0)
我理解部分视图的需要,并会告诉你我是如何解决这个问题的,但是每个视图都应该拥有它自己的模型,它应该是。这是MVVM世界的一个宗旨:
无论如何,部分可以通过接口建立模型。使用界面定义部分视图作为其模型。例如:
接口:
public interface IPhone
{
string PhoneNumber ( get; set; }
}
你建模:
public class MainModel : IPhone
{
public string Name
{
get { ... }
set { ... }
}
public string PhoneNumber
{
get { ... }
set { ... }
}
}
关键是,只要传递给主视图的模型实现了接口(接口也可以定义另一个模型的属性),部分视图依赖于该接口,那么您需要做的就是将模型传递给部分,您可能需要将模型转换为接口,但从技术上讲,您不应该这样做。如果这有帮助,请告诉我。