我ViewBag在MVC 3中看到了.ViewData与MVC 2有什么不同?
我有一个强类型的局部视图,它接受一个ProductImage,当它被渲染时,我还想为它提供一些我在包含页面中动态创建的额外ViewData.如何通过RenderPartial调用将强类型对象和自定义ViewData传递给局部视图?
var index = 0;
foreach (var image in Model.Images.OrderBy(p => p.Order))
{
Html.RenderPartial("ProductImageForm", image); // < Pass 'index' to partial
index++;
}
Run Code Online (Sandbox Code Playgroud) 在过去,我通过让所有控制器继承公共基本控制器,以全局方式将常见属性(例如当前用户)粘贴到ViewData/ViewBag上.
这使得我可以在基本控制器上使用IoC,而不仅仅是为这些数据扩展到全局共享.
我想知道是否有另一种方法将这种代码插入MVC管道?
在Stack Overflow上有一些关于这个的帖子,但没有一个答案似乎解决了我目前的情况.
我有一个页面,其中包含一个表格,每行有许多文本字段和一个下拉列表.所有下拉列表都需要使用相同的SelectList数据,所以我按如下方式设置:
调节器
ViewData["Submarkets"] = new SelectList(submarketRep.AllOrdered(), "id", "name");
Run Code Online (Sandbox Code Playgroud)
视图
<%= Html.DropDownList("submarket_0", (SelectList)ViewData["Submarkets"], "(none)") %>
Run Code Online (Sandbox Code Playgroud)
我在很多地方使用了这个设置,但由于某种原因,在这个特定的视图中,我得到了错误:
没有类型为"IEnumerable"的ViewData项具有键"submarket_0".
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult CreateUser([Bind(Exclude = "Id")] User user)
{
...
db.SubmitChanges();
ViewData["info"] = "The account has been created.";
return RedirectToAction("Index", "Admin");
}
Run Code Online (Sandbox Code Playgroud)
这不会在redirectToAction之后的viewdata中保留"info"文本.我将如何以最优雅的方式解决这个问题?
我目前的想法是将Index controlleraction中的东西放在[NonAction]中并从Index操作和CreateUser操作中调用该方法,但我觉得必须有更好的方法.
谢谢.
我知道ViewData和ViewBag都使用相同的后备数据,并且在大多数情况下都不如使用强类型模型那样好.但是,在两者之间进行选择时,ViewBag的动态特性比使用ViewData慢吗?
我遇到了一个相当令人沮丧的问题.我的MVC网站大部分运行正常,但随机抛出一个错误(向用户显示一个友好的错误).当我检查日志时,这就是我得到的:
System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'.
Run Code Online (Sandbox Code Playgroud)
片刻之后,同一个用户可以点击刷新并且页面加载正常.我被卡住了.(
更新:添加堆栈跟踪
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Web.Mvc.HandleErrorInfo' but this dictionary requires a model item of type 'BaseViewData'.
at System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value)
at System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary)
at System.Web.Mvc.HtmlHelper`1..ctor(ViewContext viewContext, IViewDataContainer viewDataContainer, RouteCollection routeCollection)
at System.Web.Mvc.ViewMasterPage`1.get_Html()
at ASP.views_shared_site_master.__Render__control1(HtmlTextWriter __w, Control parameterContainer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children) …Run Code Online (Sandbox Code Playgroud) 我本来可以用的
@Html.HiddenFor(x=> ViewData["crn"])
Run Code Online (Sandbox Code Playgroud)
但是,我明白了,
<input id="ViewData_crn_" name="ViewData[crn]" type="hidden" value="500" />
以某种方式绕过那个问题(id=ViewData_crn_ and name=ViewData[crn]),我尝试了以下操作,但是"value"属性没有设置.
@Html.HiddenFor(x => x.CRN, new { @value="1"})
@Html.HiddenFor(x => x.CRN, new { @Value="1"})
Run Code Online (Sandbox Code Playgroud)
生成
<input id="CRN" name="CRN" type="hidden" value="" />
<input Value="500" id="CRN" name="CRN" type="hidden" value="" />
Run Code Online (Sandbox Code Playgroud)
我做错了什么?谢谢
在我的Site.Master文件中,我有3个简单的ViewData参数(我整个解决方案中只有3个参数).这些ViewData值对于我的应用程序中的每个页面都至关重要.由于这些值在我的Site.Master中使用,我创建了一个抽象的SiteController类,它覆盖了OnActionExecuting方法,以便为我的解决方案中的每个控制器上的每个Action方法填充这些值.
[HandleError(ExceptionType=typeof(MyException), View="MyErrorView")]
public abstract class SiteController : Controller
{
protected override void OnActionExecuting(...)
{
ViewData["Theme"] = "BlueTheme";
ViewData["SiteName"] = "Company XYZ Web Portal";
ViewData["HeaderMessage"] = "Some message...";
base.OnActionExecuting(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当HandleErrorAttribute从SiteController类级别属性启动时,这些值不会传递给MyErrorView(最终是Site.Master).这是一个显示我的问题的简单方案:
public class TestingController : SiteController
{
public ActionResult DoSomething()
{
throw new MyException("pwnd!");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试通过覆盖SiteController中的OnException()方法来填充ViewData参数,但无济于事.:(
在这种情况下,将ViewData参数传递给Site.Master的最佳方法是什么?
HttpContext.Current.Items[...]vs存储数据ViewData[...]?我试图弄清楚在这个集合中存储数据的最佳实践,我不确定是否可以安全地存储用户特定的数据HttpContext.Current.Items.
一个用例是从基础控制器传递用户信用OnActionExecuting(...)以用于Controller计算和显示Views; 我知道我应该使用ViewData这个,但是我对嵌套的部分视图有一些不一致的结果.
难道是正确的说,HttpContext.Current.Items[...]就是Controllers喜欢ViewData[...]就是意见?
viewdata ×10
asp.net-mvc ×9
c# ×2
viewbag ×2
.net ×1
asp.net ×1
autofac ×1
controller ×1
difference ×1
handleerror ×1
httpcontext ×1
ienumerable ×1
performance ×1
razor ×1
selectlist ×1
views ×1