我正在尝试绑定MVC中的字典值.
在我的行动中:
model.Params = new Dictionary<string, string>();
model.Params.Add("Value1", "1");
model.Params.Add("Value2", "2");
model.Params.Add("Value3", "3");
Run Code Online (Sandbox Code Playgroud)
在视图中我有:
@foreach (KeyValuePair<string, string> kvp in Model.Params)
{
<tr>
<td>
<input type="hidden" name="Params.Key" value="@kvp.Key" />
@Html.TextBox("Params[" + kvp.Key + "]")
</td>
</tr>
}
Run Code Online (Sandbox Code Playgroud)
但是视图不显示初始值,并且在提交表单时Params
属性为null?
如果我希望表单中的一组输入绑定到List
MVC 4中,我知道以下input
name
属性的命名约定将起作用:
<input name="[0].Id" type="text" />
<input name="[1].Id" type="text" />
<input name="[2].Id" type="text" />
Run Code Online (Sandbox Code Playgroud)
但我很好奇模型粘合剂是多么宽容.例如,以下内容如何:
<input name="[0].Id" type="text" />
<input name="[3].Id" type="text" />
<input name="[8].Id" type="text" />
Run Code Online (Sandbox Code Playgroud)
模型绑定器如何处理这个?它会List
与null 结合长度为9吗?或者它仍然会绑定到List
3的长度?还是会完全窒息?
为什么我在乎
我想实现一个动态表单,用户可以在其中向表单添加行,也可以从表单中删除行.因此,如果我用户从总共8行中删除第2行,我想知道是否需要重新编号所有后续输入.
之前在早期版本的MVC中已经提出过这个问题.还有一篇关于解决问题的方法的博客文章.我想知道MVC3是否引入了任何可能有用的东西,或者是否还有其他选择.
简而言之.这是情况.我有一个抽象的基本模型和2个具体的子类.我有一个强类型视图,用于渲染模型EditorForModel()
.然后我有自定义模板来呈现每个具体类型.
问题来自发布时间.如果我使post post方法取基类作为参数,那么MVC不能创建它的抽象版本(我不想要它,我希望它创建实际的具体类型).如果我创建多个仅通过参数签名变化的后期操作方法,那么MVC会抱怨它不明确.
据我所知,我对如何解决这个问题有一些选择.我出于各种原因不喜欢它们,但我会在这里列出它们:
我不喜欢1,因为它基本上是隐藏的配置.其他一些开发代码的开发人员可能不知道它并浪费了大量时间来弄清楚为什么在更改内容时会出现问题.
我不喜欢2,因为它似乎有点hacky.但是,我倾向于这种方法.
我不喜欢3,因为这意味着违反DRY.
还有其他建议吗?
编辑:
我决定采用达林的方法,但稍作改动.我把它添加到我的抽象模型中:
[HiddenInput(DisplayValue = false)]
public string ConcreteModelType { get { return this.GetType().ToString(); }}
Run Code Online (Sandbox Code Playgroud)
然后隐藏自动生成我的DisplayForModel()
.你唯一需要记住的是,如果你不使用DisplayForModel()
,你必须自己添加它.
如果在ASP.NET MVC中将选择列表设置为多个,那么modelbinding如何工作?
它为您选择的项目,阵列返回什么?
<SELECT NAME="toppings" MULTIPLE SIZE=5>
<option value="mushrooms">mushrooms</option>
<option value="greenpeppers">green peppers</option>
<option value="onions">onions</option>
<option value="tomatoes">tomatoes</option>
<option value="olives">olives</option>
</SELECT>
Run Code Online (Sandbox Code Playgroud) 假设我有一个Product模型,Product模型具有ProductSubType(abstract)的属性,我们有两个具体的实现Shirt和Pants.
这是来源:
public class Product
{
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public decimal? Price { get; set; }
[Required]
public int? ProductType { get; set; }
public ProductTypeBase SubProduct { get; set; }
}
public abstract class ProductTypeBase { }
public class Shirt : ProductTypeBase
{
[Required]
public string Color { get; set; }
public bool HasSleeves { get; set; }
}
public class Pants : ProductTypeBase
{
[Required] …
Run Code Online (Sandbox Code Playgroud) 我有一个mvc应用程序,我使用这样的模型:
public class BlockedIPViewModel
{
public string IP { get; set; }
public int ID { get; set; }
public bool Checked { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个View来绑定像这样的列表:
@model IEnumerable<OnlineLotto.Web.Models.BlockedIPViewModel>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
}
@foreach (var item in Model) {
<tr>
<td>
@Html.HiddenFor(x => item.IP)
@Html.CheckBoxFor(x => item.Checked)
</td>
<td>
@Html.DisplayFor(modelItem => item.IP)
</td>
</tr>
}
<div>
<input type="submit" value="Unblock IPs" />
</div>
Run Code Online (Sandbox Code Playgroud)
现在我有一个控制器来接收来自提交按钮的动作:
public ActionResult BlockedIPList(IEnumerable<BlockedIPViewModel> lstBlockedIPs)
{
}
Run Code Online (Sandbox Code Playgroud)
但是当我进入控制器动作时,我得到了lstBlockedIPs的空值.我需要在这里获取复选框状态.请帮忙.
我的控制器中有一个方法接受一个对象作为参数并返回一个JsonResult.此对象的一个属性是具有三个可能值的枚举.我假设当客户端为该属性传入一个int时,它将填充枚举,但它没有,它默认为0,枚举设置为第一个可能的选择.
有什么建议?
我正在尝试将UTC日期作为查询字符串参数传递给Web API方法.URL看起来像
/api/order?endDate=2014-04-01T00:00:00Z&zoneId=4
Run Code Online (Sandbox Code Playgroud)
方法的签名看起来像
[HttpGet]
public object Index(int zoneId, DateTime? endDate = null)
Run Code Online (Sandbox Code Playgroud)
日期即将到来,31/03/2014 8:00:00 PM
但我希望它可以进入01/04/2014 12:00:00 AM
我JsonFormatter.SerializerSettings
看起来像这样
new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
DateFormatHandling = DateFormatHandling.IsoDateFormat
};
Run Code Online (Sandbox Code Playgroud)
编辑#1:我注意到,当我发布2014-04-01T00:00:00Z
它时,它将序列化为C#中的UTC DateTime类型.然而,我发现了一个endDate.Value.ToUniversalTime()
改变它的工作,虽然我觉得奇怪的是它如何用于POST而不是GET.
我有一个我定义为的文本框
<%= Html.TextBox("Username", Model.Form.Username,
new { @class = "textbox", @disabled = "disabled" })%>
Run Code Online (Sandbox Code Playgroud)
在我的行动中
[AcceptVerbs(HttpVerbs.Post)]
[ValidateAntiForgeryToken]
public ActionResult EditLogin(LoginForm post) {
...
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
post.Username将为空,所有其他属性绑定正确,但如果我将@disable ="disabled更改为@ readonly ="readonly"用户名绑定正确且一切正常.
看起来模型绑定忽略禁用字段中的值.他们是这样的吗?我仍然需要字段的值来绑定到模型.我可以使用readonly但更喜欢使用disabled,因此用户在视觉上可以看出他们无法编辑字段的值.
我有一个视图,列出要添加到平面图的表.从表中获得TableInputModel
允许RectangleTableInputModel
,CircleTableInputModel
等
ViewModel有一个列表,TableInputModel
其中包含所有派生类型.
我对每个派生类型都有局部视图,并且给定了一个List
混合派生类型,框架知道如何渲染它们.
但是,在提交表单时,类型信息会丢失.我尝试使用自定义模型绑定器,但因为类型信息在提交时丢失了,所以它不会工作...
有人曾尝试过这个吗?
model-binding ×10
asp.net-mvc ×9
c# ×4
.net ×1
asp.net ×1
datetime ×1
dictionary ×1
enums ×1
html ×1
json ×1
polymorphism ×1
razor ×1
viewmodel ×1