ViewDataDictionary与ASP.net MVC 5中的匿名对象

时间:2017-04-27 17:35:54

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我是初学者,我正在浏览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

1 个答案:

答案 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并不知道他们不知道他们是否存在的部分观点会发生什么。