我发现以下帖子描述了如何测试自定义模型绑定器:
然而,这测试了单个模型绑定器。理想情况下,我希望能够注册所有活页夹并测试是否绑定了适当的模型。这就是我在 ASP.NET MVC 中实现我所寻找的目标的方式:
// Register the model binders
ModelBinders.Binders[typeof(DateTime)] = new DateTimeModelBinder();
...
var values = new NameValueCollection {
{ "Foo", "1964/12/02 12:00:00" }
};
var controllerContext = CreateControllerContext(); // Utility method
var bindingContext = new ModelBindingContext() {
ModelName = "Foo",
ValueProvider = new NameValueCollectionValueProvider(values, null)
};
var binder = ModelBinders.Binders.GetBinder(typeof(DateTime));
var result = (DateTime)binder.BindModel(controllerContext, bindingContext);
Run Code Online (Sandbox Code Playgroud)
这不仅允许我测试模型绑定器的结果,而且还确保选择正确的模型绑定器。
如果有人可以提供帮助,我将不胜感激。谢谢
有关更新asp.net mvc中项目列表的快速问题.
基本上我有一个返回对象集合的编辑操作方法(顺便提一下,其表结构如下所示'testID,assetID,Result' - 一个链接表).
我基本上希望这些项目在表单中一个接一个地显示,并且能够编辑它们.表格应该回发并且模型绑定器发挥其魔力.但是,它并不那么容易.
我已经在网上搜索了,似乎关于这些东西的大部分信息似乎有点过时了.我碰到过这个帖子,已经在不长的时间没有更新,而这一次,这似乎表明,你不应该绑定到现有列表更新,并有与EF或LINQ工作时的问题到Sql(我是).
有没有一种简单的方法来实现我想要的?发布版本中是否更改了列表模型绑定的状态?
更新 - 更近一点......
这是我的编辑方法:
public ActionResult EditSurveyResults(Guid id)
{
var results = surveyRepository.GetSurveyResults(id);
return PartialView("EditSurveyResults", results);
}
Run Code Online (Sandbox Code Playgroud)
我的形式:
<div id="editSurveyResults">
<h2>
EditSurveryResults</h2>
<%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
<% using (Html.BeginForm())
{%>
<fieldset>
<legend>Results</legend>
<% int i = 0; foreach (var result in Model)
{ %>
<input type="hidden" name='results[<%= i %>].TestID' value='<%= result.TestID %>' />
<input type="hidden" name='results[<%= i %>].AssetID' value='<%= result.AssetID …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个自定义动作过滤器,它从过滤器上下文中获取传入模型,将其添加到tempdata,然后执行"其他内容".
我的动作方法如下所示:
[HttpPost]
[MyCustomAttribute]
public ActionResult Create(MyViewModel model)
{
// snip for brevity...
}
Run Code Online (Sandbox Code Playgroud)
现在,我要添加model到TempData,后模型结合已经踢并转化形式收藏价值成MyViewModel.
我怎么做?
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.Controller.ViewData.ModelState.IsValid)
return;
var model = filterContext.????; // how do i get the model-bounded object?
filterContext.TempData.Add(someKey, model);
}
Run Code Online (Sandbox Code Playgroud) c# tempdata model-binding custom-action-filter asp.net-mvc-3
我正在开发我在Asp中的第一个应用程序.我正在使用环境Asp.NET MVC 3.我有一个控制器Action,它有一个参数.此参数的类型是复杂对象.
public ActionResult MyAction(ComplexObj obj) {
//TODO: using obj
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ModelBinder类.但我不确定是否应该覆盖BindModel函数或CreateModel函数.
这两个函数之间的区别是什么,当它们被rooter使用时.
谢谢 !
controller defaultmodelbinder model-binding modelbinder asp.net-mvc-3
我有一个特殊的问题 - 我有一个带有List的ViewModel用于显示图像列表:
public List<int> TrackerKeys { get; set; }
Run Code Online (Sandbox Code Playgroud)
这在页面的两个位置使用:
@for (int i = 0; i < Model.TrackerKeys.Count(); i++)
{
@Html.GenerateImage(PageModes.Http, Model.TrackerKeys[i])
}
Run Code Online (Sandbox Code Playgroud)
并且
@for (int i = 0; i < Model.TrackerKeys.Count(); i++)
{
@Html.HiddenFor(model => model.TrackerKeys[i])
}
Run Code Online (Sandbox Code Playgroud)
这是在表单中 - 当提交表单时,如果发生验证错误,则使用新的随机数字集更新TrackerKeys属性.我正在传回上一个列表,以确保用户不会再次看到相同的图像.
跟踪器键已正确设置并传递回视图.
我的问题是:
图像根据列表中的新值正确显示新图像
然而
隐藏字段的值不会更新为新值 - 它们保留原始值.
有任何想法吗?这是MVC3的错误吗?任何投入将不胜感激.谢谢.
编辑
提交前的HTML:
<img alt="Security Character" height="35" src="http://localhost:51414/content/imagescss/26.gif" width="35" />
<img alt="Security Character" height="35" src="http://localhost:51414/content/imagescss/33.gif" width="35" />
<img alt="Security Character" height="35" src="http://localhost:51414/content/imagescss/8.gif" width="35" />
<img alt="Security Character" height="35" src="http://localhost:51414/content/imagescss/30.gif" width="35" /> …Run Code Online (Sandbox Code Playgroud) 我的主视图模型有一个ChildViewModel的集合.在视图中,我遍历集合并调用EditorFor(),如下所示:
@for (int i = 0; i < Model.Children.Count; i++)
{
@Html.EditorFor(m => m.Child[i]);
}
Run Code Online (Sandbox Code Playgroud)
编辑器模板如下所示:
@model ChildModel
@using (Html.BeginForm("EditChild", "MyController"))
{
@Html.HiddenFor(m => m.ChildId)
@Html.TextBoxFor(m => m.ChildName)
}
Run Code Online (Sandbox Code Playgroud)
这将生成标记,其中每个子项都是单独的形式,并且每个这样的表单将具有名为Child [0] .ChildName的输入控件.我为每个孩子使用单独的表单,因为孩子们将在每行显示一个,然后用户可以编辑并提交单行.
我的表单操作方法是:
[HttpPost]
public ActionResult EditChild(ChildViewModel form) { }
Run Code Online (Sandbox Code Playgroud)
问题是,当调用它时,模型的所有属性都将为null,因为模型绑定器不知道前缀.在某些情况下,我们可以使用BindAttribute告诉模型绑定器有关前缀的信息,但在这种情况下,前缀不是常量:它将是Child [0],Child [1]等.
总之,我们希望为集合的每一行重复相同的表单,然后允许用户POST一个表单.在这种情况下,Web如何处理id,名称,前缀和模型绑定?
我有一个ViewModel如下:
public class CheckoutViewModel
{
public string ProductNumber { get; set; }
public string Name { get; set; }
public int Price { get; set; }
public Input UserInput;
public class Input
{
public string Email { get; set; }
public string Phone { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
这样的动作:
[HttpPost]
public ActionResult Index(CheckoutViewModel model)
{
// ...
return View();
}
Run Code Online (Sandbox Code Playgroud)
我的模型如下所示:
@model GameUp.WebUI.ViewModels.CheckoutViewModel
@using (Html.BeginForm("Index", "Checkout", FormMethod.Post))
{
@Html.AntiForgeryToken()
<!-- some HTML -->
@Html.LabelFor(m => m.UserInput.Email)
@Html.TextBoxFor(m => m.UserInput.Email) …Run Code Online (Sandbox Code Playgroud) 我有一节课:
public class ClientInformation{
public string UserName {get; set;}
public ICollection<RegionDistrictCity> RegionDistrictCity
{
get;
set;
}
public class RegionDistrictCity
{
public string Region { get; set; }
public string District { get; set; }
public string City { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
为了使模型绑定器填充集合"ICollection RegionDistrictCity",应如何在html中为属性Region,Distirct,City格式化输入元素的name属性?
我尝试使用类型为"ClientInformation"的参数的动作方法和格式化为"[index] .PropertyName"的html名称属性,但在这种情况下,只有属性"UserName"被绑定.
我尝试使用参数名称"client"的操作方法,并将html名称属性格式化为"client [index] .PropertyName",但它不起作用.(如果我有一个"列表客户端",那么它会被填充)
谢谢.
我使用了以下教程:http: //msdn.microsoft.com/en-us/library/gg508808%28VS.98%29.aspx
一切似乎都很好,但就我而言,字符串Username总是返回null.经过大量的研究,我发现每个人都发现了BIND前缀.在许多情况下,这将是伟大的,但不是这个.我应该注意所有属性和名称排列,但是在我的for循环中,EditorFor创建了一个[i] .Username字段,这不会映射到任何模型属性.
问题:我想我想将[i] .Username映射到Username,其中i是0-infinity中的任何数字,所以当它GETS时,该值会正确地传递给Action.我该怎么做呢?如果这是错误的,我该怎么做才能对表格中的特定行进行验证?
@for (var i = 0; i < Model.Count; i++)
{
BLAH BLAH BLAH CODE FOR BUILDING TABLE ROWS
<td>
@Html.EditorFor(modelItem => Model[i].Username)
</td>
}Run Code Online (Sandbox Code Playgroud)
因为如果不是成千上万的记录,我在技术上可以拥有HUNDREDS,我宁愿没有一个绑定PREFIX的所有1000.我从根本上错过了一些东西吗?我是ASP.NET MVC的新手,习惯了WebForms,所以我觉得有时候我会混合概念并混合一些完全错误的东西.
编辑: 我通过执行以下操作修复它,但不确定这是否是最好的主意.我将参数设置为没有[i]前缀的FieldName,但仍然检索带有[i]前缀的元素.Javascript不是我的Forte所以如果它太可怕请告诉我.
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = fieldName.substr(fieldName.lastIndexOf(".") + 1);
var actualFieldName = appendModelPrefix(fieldName, prefix)
value.data[paramName] = …Run Code Online (Sandbox Code Playgroud) 我需要在wpf mvvm应用程序中的有界组合框中添加一个空项目,我试过这个
<ComboBox TabIndex="23" Text="{Binding Specialisation}" DisplayMemberPath="refsp_libelle">
<ComboBox.ItemsSource>
<CompositeCollection >
<ComboBoxItem > </ComboBoxItem>
<CollectionContainer Collection="{Binding SpecialisationItemSource}" ></CollectionContainer>
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
它在我尝试添加空项目之前有效.
<ComboBox TabIndex="23" Text="{Binding Specialisation}" ItemsSource="{Binding SpecialisationItemSource}" DisplayMemberPath="refsp_libelle"/>
Run Code Online (Sandbox Code Playgroud)
所以我需要知道:
谢谢,
model-binding ×10
c# ×5
asp.net-mvc ×4
.net ×1
asp.net ×1
controller ×1
list ×1
modelbinder ×1
mvvm ×1
razor ×1
tempdata ×1
views ×1
wpf ×1