【问题标题】:ViewDataDictionary vs anonymous object in ASP.net MVC 5ASP.net MVC 5 中的 ViewDataDictionary 与匿名对象
【发布时间】:2017-04-27 17:35:54
【问题描述】:

我是一个初学者,我正在学习我的 MVC 中的一些教程。所以,我遇到了两种情况。

场景 1。

我必须在帖子中将一些数据传递给我的视图,然后将这些数据作为隐藏字段发送。这是代码。

    [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);
    }

验证令牌视图

@using (@Html.BeginForm("VerifyToken", "Security"))
{
    @Html.HiddenFor(m => m.EmailId)
    <button class="btn btn-primary">Continue</button>
}

工作得很好。我能够接收 EmailId 的值。到目前为止一切顺利。

场景 2。

需要从主视图打开部分视图,这里是sn-p。

主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

【问题讨论】:

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


    【解决方案1】:

    您的两种情况完全不同。他们没有做同样的事情。

    在场景 1 中使用此行时:

    return RedirectToAction("VerifyToken", new { emailId = viewModel.EmailId });
    

    生成一个新的 URL,并使用 HTTP 代码 301 或 302 发送回客户端(浏览器)。收到后,浏览器将使用收到的 URL 重新联系您的应用程序。使用该 URL,您的应用程序将执行相关操作。在您的情况下,当您将RedirectionToAction 调用到ForgotPassword 操作时,客户端的浏览器将调用VerifyToken 操作并设置emailId 参数。因此,使用RedirectionToAction 方法只是告诉该方法生成一个新的 URL,该 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 URL 后生成的新 URL。我们只是称其为重定向。

    在场景 2 中,您只是将部分视图渲染到视图中。客户的浏览器对他们不知道是否存在的部分视图一无所知。

    【讨论】:

    • 所以我永远不能在第二种情况下使用匿名对象之类的东西?第二种情况。 @Html.Partial("../Widget/Customize", Model.Unit, new { ElementName, "UnitWidget" } }) 然后在 CSHTML 文件中 string custWidgetElementName = ElementName??
    • 我是初学者,请原谅我的无知。
    • 不,你不能,因为微软没有提供可以替换 ViewDataDictionary 的 Html.Partial 方法的重载。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多