我有两种看法。我认为1有文本框可输入基本详细信息。客户输入基本详细信息并单击添加更多详细信息后,我需要将在view1中输入的详细信息传递给view2文本框。我使用隐藏的方式穿越。但是它并没有传递到下一个观点。请提出任何建议。
View1控制器:
public ActionResult View1()
{
return View();
}
[HttpPsot]
public ActionResult View2()
{
return ProcessAction();
}
View2控制器:
public ActionResult View2()
{
return View();
}
View1:
<script>
$(document).ready(function() {
$("#add").click(function() {View2", "Application")";
});
});
</script>
@using (Html.BeginForm("View1", "Application", FormMethod.Post))
{
@Html.AntiForgeryToken()
@Html.HiddenFor(model => model.LastName)
@Html.HiddenFor(model => model.FirstName)
@Html.HiddenFor(model => model.Email)
<div class="col aligncenter">
<div class="form-row topMargin">
<div class="col-md-6 form-group">
@Html.TextBoxFor(model => model.Email)
</div>
<div class="col-md-4 form-group">
@Html.TextBoxFor(model => model.FirsttName)
</div>
<div class="col-md-2 form-group">
@Html.TextBoxFor(model => model.LastName)
</div>
</div>
<div class="form-row">
<div class="col-md-9 form-group text-right">
<button class="btn" type="button" id="add" name="add" value="add">Add</button>
</div>
<div class="col-md-3 form-group text-right">
<button class="btn" type="submit" name=new" value="new">view old</button>
</div>
</div>
</div>
}
View2:
@using (Html.BeginForm("View2", "Application", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="col aligncenter">
<div class="form-row topMargin">
<div class="col-md-6 form-group">
@Html.TextBoxFor(model => model.Email)
</div>
<div class="col-md-4 form-group">
@Html.TextBoxFor(model => model.FirsttName)
</div>
<div class="col-md-2 form-group">
@Html.TextBoxFor(model => model.LastName)
</div>
<div class="col-md-2 form-group">
@Html.TextBoxFor(model => model.address)
</div>
<div class="col-md-2 form-group">
@Html.TextBoxFor(model => model.state)
</div>
<div class="col-md-2 form-group">
@Html.TextBoxFor(model => model.zip)
</div>
</div>
<div class="form-row">
<div class="col-md-9 form-group text-right">
<button class="btn" type="submit" value="osubmit">submit</button>
</div>
</div>
</div>
}
答案 0 :(得分:1)
好吧,这是错误的。首先,删除view1上的隐藏字段,因为您将它们放在@Html.TextBoxFor
控件中,所以不需要它们。
第二,当您将view1
的形式发布到控制器时,它需要接收view1的ViewModel
,并将值传递给View2的ViewModel
因此,我们需要您的控制器中的另一种方法来处理POST
事件,该事件在您单击View1
上的Submit并采用您的表单值时发生...
[ValidateAntiforgeryToken]
[HttpPost]
public ActionResult View1(View1ViewModel model)
{
if (ModelState.Isvalid)//check if valid
{
var newModel = new View2ViewModel()
{
Email = model.Email,
LastName = model.LastName,
FirstName = model.FirstName
};
return View("~/The path of view 2", newModel);//go to view 2
}
return View(model);//return the first view if it's not valid
}
编辑:忘记了post方法上的AntiforgeryToken
!
答案 1 :(得分:0)
在MVC中,视图和控制器紧密结合在一起,当您正确设计MVC应用程序时,视图不会直接与Model类或其他视图通信:它们仅处理控制器。
这意味着您的View1必须将其数据发送回控制器,该控制器的工作将是获取这些数据,执行验证逻辑,修改模型(如果需要),然后使用获得的已处理数据调用View2。从View1。怎么发生的?
首先,您将需要几个ViewModel来包装所需的所有数据
public class MainViewModel
{
public string MainData;
}
public class DetailsViewModel
{
public string DetailsData;
}
然后我们有了控制器。假设您有一个具有简单View1
方法的控制器:
public View1()
{
return View()
}
这将调用您的View1
,其中显示模型的空白字段
@MyApp.Models.ViewModel
@using(Html.BeginForm(“View1”))
{
@Html.EditorFor(m => m.MainData)
// submit
}
这将导致对控制器中的POST
方法的View1
调用。由于具有过滤器属性,您可以在同一控制器中指定第二个View1方法,该方法的工作将处理从View1发送的数据并将用户重定向到View2
[HttpPost]
public RedirectToRouteResult View1(ViewModel model)
{
repository.Set(model.MainData);
return RedirectToAction(“View2”);
}
现在,只需在View2中重复调用HttpPost方法,即可使用来自View2表单的DetailsData更新存储库