我的应用程序中有一对视图,它们都为我的一个模型项显示相同的编辑器模板; 在两个视图("添加"和"编辑")中,"编辑"工作正常,但当我的控制器操作处理帖子时,"添加"为模型返回null.
我发现如果我给"添加"视图一个自定义的ViewModel并调用Html.EditorFor(p => p.PageContent)而不是简单地在整个Model对象上调用EditorFor()Html.EditorFor(p => p),那么表单将返回正确的非null模型,但是会产生与之相关的其他问题.我的客户端脚本和控件ID(现在所有字段都以"PageContent_"为前缀).我在整个应用程序中的几个不同的地方使用相同的编辑器模板技术,其他人都没有表现出对ViewModel的奇怪依赖.
有没有其他人遇到类似的问题?
编辑视图
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", Model.Page.ID) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" name="btnCancel" value="Cancel" class="cancel" />
<% }
Run Code Online (Sandbox Code Playgroud)
行动(工作)
[HttpPost, ValidateInput(false)]
public ActionResult EditContent(int id, FormCollection formCollection) {}
Run Code Online (Sandbox Code Playgroud)
添加视图
<%@ Page Title="" Language="C#" MasterPageFile="~/Areas/Admin/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<PageContent>" %>
<% using (Html.BeginForm())
{ %>
<%=Html.Hidden("PageID", ViewData["PageID"]) %>
<%=Html.EditorFor(p => p)%>
<input type="submit" name="btnSave" value="Save" />
<input type="submit" …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET MVC中有一个简单的表单.我试图将这些结果发布到控制器动作,我的行为很奇怪.
这view是一个简单的HTML表:
图片查看http://img502.imageshack.us/img502/7271/survey.png
以下是HTML表单视图的一部分:
<form action="/Applications/UpdateSurvey" method="post"><table id=questionsTable class=questionsTable border=1>
<thead><tr><td>Name</td><td>Answer</td><td>Name Attribute(for debugging)</td></tr> </thead><tbody>
<tr>
<td>Question 0:</td>
<td><input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=1 >1 <input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=2 >2 <input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=3 >3 <input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=4 >4 <input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=5 >5 </td>
<td>updater.questions[0].responseIds</td>
</tr>
<tr>
<td>Question 1:</td>
<td><input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=1 >1 <input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=2 >2 <input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=3 >3 <input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=4 >4 <input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=5 >5 </td>
<td>updater.questions[1].responseIds</td>
</tr>
</tbody></table> …Run Code Online (Sandbox Code Playgroud) 我在页面上有这个链接
<% = Html.ActionLink(item.Title, "Edit", "ArticleManagement",
new { id = item.ArticleDataID })%>
Run Code Online (Sandbox Code Playgroud)
以及接收文章Id的简单方法
public ActionResult Edit(int id)
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到一个错误" 参数字典包含int32的参数id的空值,用于编辑(Int32)... "
当我查看Url时,我看到类似" http:// localhost:59786/ArticleManagement/Edit?Length = 17 "的内容
什么是" 长度= 17 "?那里有什么?无论如何,到目前为止,我正在使用一个只有3个项目的集合.
谢谢你的帮助
我已经看过关于这个主题的其他帖子,并且已经摆弄了变化,但仍然无法让JSON模型绑定正常工作.
我在global.asax.cs Application_Start方法中有以下内容:
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)
回发后的数据如下所示:
{"UserName":"Mike","Password":"password","Persist":true}
Run Code Online (Sandbox Code Playgroud)
我的PoCo:
public class UserLoginViewModel {
public string UserName { get; set; }
public string Password { get; set; }
public bool Persist { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器方法正确触发,但具有UserName = null,Password = null和Persist = false的默认UserLoginViewModel对象; 签名看起来像这样:
[HttpPost]
public ActionResult Logon(UserLoginViewModel model) {
if (ModelState.IsValid) {
...
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个很好的资源,它非常详细地描述了模型绑定如何与ASP.NET MVC 3(或在较小程度上,MVC 2)和不同方法一起工作.我没有找到关于这个主题的任何好资源,除了那里的点点滴滴.网上的信息更多地是关于"如何做X"而不是解释模型绑定的内部如何工作.有什么建议?书籍推荐也很好.
当存在子属性时,我遇到了默认模型绑定命名约定的问题.例如:
我有一个ViewModel,它看起来像这样:
public class UserViewModel
{
public User BusinessObject { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的User类有一个名为"NetworkLogin"的属性
我的视图具有以下内容:<%:Html.LabelFor(model => model.BusinessObject.NetworkLogin)%> <%:Html.TextBoxFor(model => model.BusinessObject.NetworkLogin)%>自动填充
我的控制器,我想做的,是
[HttpGet]
public ActionResult UserIndex(string networkLogin) { }
Run Code Online (Sandbox Code Playgroud)
问题:输入参数"networkLogin"始终为null.这是有道理的,因为html元素上的实际参数是name ="BusinessObject.NetworkLogin"和id ="BusinessObject_NetworkLogin".但是,我不知道我应该在我的action方法中使用什么参数名称.我尝试过"businessObject_NetworkLogin",它也不起作用.
但是,我有这个解决方法确实有效,但我不喜欢它.我将它添加到我的ViewModel:
public string NetworkLogin
{
get
{
if (BusinessObject == null)
BusinessObject = new User();
return BusinessObject.NetworkLogin;
}
set
{
if (BusinessObject == null)
BusinessObject = new User();
BusinessObject.NetworkLogin = value;
}
}
Run Code Online (Sandbox Code Playgroud)
而我的View页面现在却说明了这一点.<%:Html.TextBoxFor(model => model.NetworkLogin)%>
有人能告诉我默认模型绑定的正确命名约定是什么,这样我就不必采用上述解决方法了吗?
谢谢!
我知道如何使用JDBC模板和DAO,但我仍然有疑问:
RowMapper和ResultSetExtractor?ASP.NET MVC(MVC4)中是否有任何有用的钩子可以让您在调用操作方法之前访问Action方法参数(View模型),然后还可以(例如,取决于您在操作方法中检查的内容的值)参数)让你阻止调用动作方法,即将视图模型对象(动作方法参数)转发到另一个动作方法或直接转发到某个视图(即动作方法中没有任何进一步处理)?
如果您不理解这个问题,请参阅下面的代码示例,它应该说明我正在寻找的代码类型...(虽然我不知道是否确实存在这样的接口并且可能将实现挂钩到MVC框架)
如果这确实可行,我想看一个关于如何做到的代码示例的答案(而不仅仅是对某人声称例如"尝试使用方法'ActionFilterAttribute.OnActionExecuting'或'IModelBinder.BindModel'的响应",因为我已经尝试过这些并且无法使其工作).另外,请尊重我不希望这个帖子成为关于为什么这样做的讨论,但是想看看如何做到这一点.(即我不想与诸如"你究竟想要实现什么?"或"你想做什么可能更好的事情......"这样的回答进行讨论.)
这个问题可以分成三个子问题/代码示例,下面我自己的代码示例试图说明:(但希望它们"重构"为使用真实存在类型的REAL代码)(显然,下面包含子字符串的每个类型)一些"是我已经弥补的东西,我正在寻找相应的真实......"
(1)在使用视图模型对象参数调用实际操作方法之前,如何在通用位置访问(并可能修改)视图模型对象(操作方法参数)的示例.
我正在寻找的那种代码示例可能类似于下面但不知道使用什么类型的接口以及如何注册它以便能够执行以下操作:
public class SomeClass: ISomeInterface { // How to register this kind of hook in Application_Start ?
public void SomeMethodSomewhere(SomeActionMethodContext actionMethodContext, object actionMethodParameterViewModel) {
string nameOfTheControllerAboutToBeInvoked = actionMethodContext.ControllerName;
string nameOfTheActionMethodAboutToBeInvoked = actionMethodContext.MethodName;
// the above strings are not used below but just used for illustrating that the "context object" contains information about the action method to become invoked by the MVC framework
if(typeof(IMyBaseInterfaceForAllMyViewModels).IsAssignableFrom(actionMethodParameterViewModel.GetType())) {
IMyBaseInterfaceForAllMyViewModels viewModel = (IMyBaseInterfaceForAllMyViewModels) …Run Code Online (Sandbox Code Playgroud) 有没有办法用一个来自请求参数的值更改绑定前缀?
我有许多嵌套的搜索弹出窗口,并且它们都共享相同的ViewModel.
我可以在请求搜索过滤器时为所有字段添加绑定前缀,但我不知道如何使[Bind(Prefix ="")]使用来自请求参数的值.
// get the search filters with the bindingPrefix we need
public ActionResult Search(string bindingPrefix)
{
ViewData.TemplateInfo.HtmlFieldPrefix = bindingPrefix;
SearchViewModel model = new SearchViewModel
{
BindingPrefix = bindingPrefix
};
return PartialView("_SearchFilters", model);
}
// post the search filters values
[HttpPost]
public ActionResult Search([Bind(Prefix = model.BindingPrefix)]SearchViewModel model)
{
}
Run Code Online (Sandbox Code Playgroud) 我想在我的模型中将一组文本框(小时,分钟和秒)绑定到TimeSpan.我不想在我的模型中添加小时,分钟和秒,我宁愿不将它们作为参数传递给action方法.
我发现了一些关于使用编辑器模板的讨论,但找不到一个好的例子.
model-binding ×10
asp.net-mvc ×7
asp.net ×3
.net ×2
c# ×1
dao ×1
java ×1
jdbctemplate ×1
json ×1
spring ×1
viewmodel ×1