我是初学者,我正在浏览MVC中的一些教程。所以,我遇到了两种情况。
情景1。
我必须将一些数据传递给我在post上的视图,然后将该数据作为隐藏字段发送。这是代码。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult ForgotPassword(ForgotPasswordMV viewModel)
{
if (ModelState.IsValid)
{
return RedirectToAction("VerifyToken", new { emailId = viewModel.EmailId });
}
^^ USING ANONYMOUS OBJECTS
return View();
}
public ActionResult VerifyToken(string emailId = null)
{
VerifyTokenMV viewModel = new VerifyTokenMV
{
EmailId = emailId
};
return View(viewModel);
}
VerifyToken查看
@using (@Html.BeginForm("VerifyToken", "Security"))
{
@Html.HiddenFor(m => m.EmailId)
<button class="btn btn-primary">Continue</button>
}
作品非常好。我能够收到EmailId的值。到目前为止一切都很好。
情景2。
需要从主视图打开局部视图,这是片段。
主要cshtml文件
<div class="abc">
@Html.Partial("../Widget/Customize", Model.Unit, new ViewDataDictionary() { { "ElementName", "UnitWidget" } })
</div>
部分cshtml文件
@{
string custWidgetElementName = ViewBag.ElementName;
}
// some html code below
观察:
在方案2中,为什么我使用了ViewDataDictionary。虽然这两个例子都很好。但是我有什么理由不得不使用ViewDataDictionary。在scenraio 1
我们可以使用ViewDataDictionary吗?如果是,那么哪一个是最佳解决方案。
问题:当我需要传递值时,我应该使用new {key : value}
还是使用ViewDataDictionary
或者没有核心化?我可以在 Senario 2
ViewDataDictionary
答案 0 :(得分:1)
您的两种情况完全不同。他们没有做同样的事情。
在方案1中使用此行时:
return RedirectToAction("VerifyToken", new { emailId = viewModel.EmailId });
生成新URL并使用HTTP代码301或302将其发送回客户端(浏览器)。收到后,浏览器将通过收到的URL重新联系您的应用程序。使用该URL,您的应用程序将执行相关操作。在您的情况下,当您致电VerifyToken
进入emailId
操作时,客户端的浏览器会调用RedirectionToAction
参数设置的ForgotPassword
参数。因此,使用RedirectionToAction
方法只是告诉该方法生成具有匿名类型中定义的参数的新URL。
在方案2中与方案1完全不同。使用以下行:
@Html.Partial("../Widget/Customize", Model.Unit, new ViewDataDictionary() { { "ElementName", "UnitWidget" } })
您告诉您的观点是注入部分视图,哪条路径为../Widget/Customize
。由于该部分视图是强类型的,因此您将Model.Unit
作为第二个参数传递。您还使用了第三个参数new ViewDataDictionary() { { "ElementName", "UnitWidget" } }
,因为您的部分内部似乎需要访问视图的动态属性ViewBag
或字典属性ViewData
。
<强>结论:强>
在方案1中,您只是告诉客户的浏览器在请求ForgetPassword
网址后转到您生成的新网址。我们称之为重定向。
在方案2中,您只是将局部视图渲染到视图中。客户的broswer并不知道他们不知道他们是否存在的部分观点会发生什么。