boi*_*222 7 c# asp.net-mvc asp.net-mvc-4
我是MVC的新手,所以请放轻松我.我收到了一个在MVC中启动的项目,并被告知要添加它.我很好,直到我得到一个需要两个不同模型的数据的部分.现在我被困住了,我的老板昨天想要这样做.如果可以的话请帮忙.
我有一个视图有两个部分视图和一个提交按钮.每个部分视图使用不同的模型.视图在屏幕上显示用户可以改变的信息.然后单击提交按钮.在控制器中,我想访问两个模型中的数据(用户在屏幕上输入的值).现在,我甚至无法通过提交按钮来呼叫控制器.这是我需要立即帮助的部分,但我最终需要知道如何从控制器访问两个模型的数据.
这是我想要做的基本想法:

这是我的观点:CreateContract.cshtml
<div class="container-fluid">
@using (Html.BeginForm("CreateContract", "CreateContract", FormMethod.Post, new { @class = "form-horizontal " }))
{
<div id="PartialDiv">
@{
Html.RenderPartial("ApplicationPartialView", new CarmelFinancialWeb.Models.ModelApplication());
Html.RenderPartial("ContractPartialView");
}
</div>
<input id="btnCreateContract" type="submit" class="btn btn-primary" value="Save" name="CreateContract" />
}
</div>
Run Code Online (Sandbox Code Playgroud)
这是控制器CreateContractController.cs的一部分.当视图打开并且工作正常时,会触发此方法.
[AuthorizeAdmin]
public ActionResult CreateContract(string ID)
{
ModelContract obj_Contract = new ModelContract();
obj_Contract.BuyerName = "MOCS";
return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_Contract);
}
Run Code Online (Sandbox Code Playgroud)
这是控制器CreateContractController.cs的一部分.单击提交按钮时,不会触发此方法.我尝试过包含其他方法的字符串ID变量以及ModelContract和ModelApplication(及其各种组合),但我无法调用此方法.
[AuthorizeAdmin]
[HttpPost]
public ActionResult CreateContract()
{
ModelApplication obj_App = new ModelApplication();
return View(@"~/Views/CreateContract/CreateContract.cshtml", obj_App);
}
Run Code Online (Sandbox Code Playgroud)
这些是部分视图的控制器中的方法.这些也没有被调用.
public PartialViewResult ApplicationPartialView(string ID)
{
ModelApplication obj_App = new ModelApplication();
if (ID != null && ID != "0" && ID != null && ID != "")
{
obj_App = objBllApplication.GetApplicationByID(int.Parse(ID));
}
return PartialView("CreateContractApplicationPartialView");
}
public PartialViewResult ContractContractPartialView()
{
ModelContract obj_Contract = new ModelContract();
obj_Contract.DealerID = "MOCS";
return PartialView("CreateContractContractPartialView");
}
Run Code Online (Sandbox Code Playgroud)
Chr*_*att 13
这里有很多内容,这对你有所帮助,特别是因为你是新手.首先,视图只能有一个模型.高级别的原因是它实际上是通过一个通用类来呈现的,所选择的模型就像它的类型一样填充.你可以通过使用部分视图来欺骗你,但是你仍然必须将模型实例纳入其中.似乎你试图通过在控制器中创建动作来表示那些部分,但这些实际上是没用的.他们永远不会被召唤.Html.Partial或者Html.RenderPartial只是渲染指定的视图,默认情况下使用与调用视图相同的模型,或者作为模型传递给这些方法的对象(第二个参数).它不会返回控制器.
在MVC中,有一种称为"子操作"的东西,因为你似乎想要部分到这里工作.通过使用Html.Action或Html.RenderAction替代,您可以在控制器上调用此操作以返回部分视图.但有两件事:
如果你要返回一个局部视图(而不是一个完整的视图),那么你应该用它来装饰动作[ChildActionOnly].否则,操作将暴露给来自浏览器的直接URL访问,这将单独呈现局部视图,而不进行任何布局.
子操作只能用于GET样式的请求.您无法POST到子操作.
对于这样的事情来说,实际上最好只使用子动作来呈现表单的单独区域,如果表单的各个区域将被发布到不同的位置.以组合页面为例,您可以同时拥有登录或注册概念.您可以使用子操作来呈现每个单独的字段组,但登录部分应POST到登录操作,并且注册部分应发布到注册操作.您不会将两个表单中的所有内容都发布到同一个操作中.
在您的特定场景中,部分视图实际上是要走的路,但您只需要将主视图的模型调整为包含两个子模型的视图模型.例如:
public class MyAwesomeViewModel // name doesn't matter
{
public ModelApplication Application { get; set; }
public ModelContract Contract { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,在您的主视图中:
@model Namespace.To.MyAwesomeViewModel
...
@Html.Partial("ApplicationPartialView", Model.Application)
@Html.Partial("ContractPartialView", Model.Contract)
Run Code Online (Sandbox Code Playgroud)
最后,您的POST操作会将此视图模型作为参数:
[HttpPost]
public ActionResult CreateContract(MyAwesomeViewModel model)
{
...
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6206 次 |
| 最近记录: |