标签: model-binding

ASP.NET Core - 模型绑定测试

我发现以下帖子描述了如何测试自定义模型绑定器:

/sf/answers/3877101511/

然而,这测试了单个模型绑定器。理想情况下,我希望能够注册所有活页夹并测试是否绑定了适当的模型。这就是我在 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)

这不仅允许我测试模型绑定器的结果,而且还确保选择正确的模型绑定器。

如果有人可以提供帮助,我将不胜感激。谢谢

c# model-binding asp.net-core-mvc

4
推荐指数
1
解决办法
2929
查看次数

ASP.NET MVC更新一个表单上的对象列表?(模型绑定到列表)

有关更新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)

asp.net-mvc list model-binding

3
推荐指数
1
解决办法
1万
查看次数

ASP.NET MVC 3自定义操作过滤器 - 如何将传入模型添加到TempData?

我正在尝试构建一个自定义动作过滤器,它从过滤器上下文中获取传入模型,将其添加到tempdata,然后执行"其他内容".

我的动作方法如下所示:

[HttpPost]
[MyCustomAttribute]
public ActionResult Create(MyViewModel model)
{
   // snip for brevity...
}
Run Code Online (Sandbox Code Playgroud)

现在,我要添加modelTempData,模型结合已经踢并转化形式收藏价值成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

3
推荐指数
1
解决办法
5603
查看次数

bindmodel vs createmodel asp 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

3
推荐指数
1
解决办法
1414
查看次数

MVC3模型绑定 - 列表到隐藏字段

我有一个特殊的问题 - 我有一个带有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)

c# views model-binding razor asp.net-mvc-3

3
推荐指数
1
解决办法
9412
查看次数

如何处理集合中每一行重复相同形式的MVC模型绑定前缀?

我的主视图模型有一个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,名称,前缀和模型绑定?

asp.net-mvc model-binding asp.net-mvc-3

3
推荐指数
1
解决办法
1741
查看次数

在模型绑定之后,模型嵌套类型为null

我有一个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)

asp.net-mvc model-binding asp.net-mvc-4

3
推荐指数
1
解决办法
2932
查看次数

asp.net - 绑定到嵌套集合的MVC模型

我有一节课:

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",但它不起作用.(如果我有一个"列表客户端",那么它会被填充)

谢谢.

model-binding asp.net-mvc-4

3
推荐指数
1
解决办法
8328
查看次数

模型LIST的远程验证

我使用了以下教程: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)

c# asp.net asp.net-mvc model-binding remote-validation

3
推荐指数
1
解决办法
1938
查看次数

将空项添加到有界组合框中

我需要在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)

所以我需要知道:

  1. 我犯的错误是什么?
  2. 我该如何解决?

谢谢,

.net c# wpf mvvm model-binding

3
推荐指数
1
解决办法
3185
查看次数