标签: model-binding

如何将URL参数绑定到具有不同名称的模型属性

好吧,假设我有一个像这样的URL,它通过HTTP动词映射GET到我在下面的控制器操作:

GET /foo/bar?sort=asc&r=true
Run Code Online (Sandbox Code Playgroud)

如何Bar在我的控制器操作上将其绑定到我的模型,我在下面:

class Bar {
    string SortOrder { get; set; }
    bool Random { get; set; }
}

public ActionResult FooBar(Bar bar) {
    // Do something with bar
    return null;
}
Run Code Online (Sandbox Code Playgroud)

请注意,属性名称不会也不一定与URL参数的名称匹配.此外,这些是可选的url参数.

asp.net-mvc model-binding

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

HiddenFor(x => x.Id)由UrlParameter而不是ViewModel填充

public ActionResult SomeAction(int Id){
    //Id is set to 2

    var model = //get some thing from db using Id(2);
    //Now model.Id is set to 9;

    return View(model);
}

----------View----------
@Html.HiddenFor(x => x.Id)
Run Code Online (Sandbox Code Playgroud)

当我查看源时,此隐藏字段设置为2而不是9.如何将其映射到模型而不是映射到URL路由信息?

PS我不想重命名参数因为那时我会丢失我看起来很漂亮的网址,除非我改变路由信息.我已经做到了,它确实有效,但不是我想要的.

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

10
推荐指数
1
解决办法
3512
查看次数

在ASP.NET MVC POST中绑定IEnumerable的模型?

将IEnumerable类型的模型绑定到MVC POST是否有任何问题?

我的模型中的某些属性未绑定到操作的帖子.似乎模型上的属性就像字符串一样好,但我的IEnumerable是没有绑定的.

这是我的代码片段:

<%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.Test) %>
    <% for (int i = 0; i < Model.ResponseInfo.SubsetInfo.BandAvailabilities.Count(); i++)
    {%>
        <%: Html.TextBoxFor(m => m.ResponseInfo.SubsetInfo.BandAvailabilities.ToArray()[i].BandName) %>
  <% } %>
Run Code Online (Sandbox Code Playgroud)

以下是这些属性在模型中的样子:

public IEnumerable<BandAvailabilityInfo> BandAvailabilities { get; set; }
public string Test { get; set; }
Run Code Online (Sandbox Code Playgroud)

视图工作正常,并输出一个文本框列表,其中包含预期值.但是被解雇的帖子只会将Test字符串识别为属性.模型状态也不包含我的IEnumerable数据.

c# asp.net-mvc ienumerable model-binding

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

如何控制模型绑定?

我最近开始使用MVC而且我很少失望.框架正在阻碍我,而不是帮助我.

我正在尝试编写这样的控制器动作(伪代码)

ActionResult Save(long id, string whichForm)
{
    if (whichForm == "A")
    {
        var vm = CreateModel(Request.Form);
        if (!TryValidate(vm))
            return View(vm);
        else
            return RedirectToRoute("Success");
    }
    else ....
}
Run Code Online (Sandbox Code Playgroud)

基本上我想控制构建视图模型的时间以及何时验证它.这可能吗?如何实现CreateModel方法?考虑我可能想在此控制器操作中创建几个不同的视图模型.

*Rant:我真的不明白为什么在DefaultModelBinder中将视图模型绑定和验证混合在一起.好像代码味道.特别是当它很难覆盖这种行为时.

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

10
推荐指数
1
解决办法
2531
查看次数

没有一堆隐藏字段的成功模型编辑

简而言之:如何成功编辑数据库条目而无需在编辑视图中包含模型的每个字段?

更新
所以我在DB(文章)中有一个项目.我想编辑一篇文章.我编辑的文章有很多属性(Id,CreatedBy,DateCreated,Title,Body).其中一些属性永远不需要更改(如Id,CreatedBy,DateCreated).因此,在我的编辑视图中,我只想要可以更改的字段的输入字段(如标题,正文).当我像这样实现编辑视图时,模型绑定失败.我没有提供输入的任何字段都设置为某个"默认"值(如DateCreated设置为01/01/0001 12:00:00 am).如果我确实为每个字段提供输入,一切正常,文章按预期编辑.我不知道是否正确地说"模型绑定失败"是必要的,如果"如果在编辑视图中没有为它们提供输入字段,则系统会填充包含不正确数据的字段".

如何以这样的方式创建编辑视图:我只需要为可以/需要编辑的字段提供输入字段,以便在调用Controller中的Edit方法时,正确填充DateCreated等字段,而不设置某些默认值,不正确的值?这是我目前的编辑方法:

    [HttpPost]
    public ActionResult Edit(Article article)
    {
        // Get a list of categories for dropdownlist
        ViewBag.Categories = GetDropDownList();


        if (article.CreatedBy == (string)CurrentSession.SamAccountName || (bool)CurrentSession.IsAdmin)
        {                
            if (ModelState.IsValid)
            {
                article.LastUpdatedBy = MyHelpers.SessionBag.Current.SamAccountName;
                article.LastUpdated = DateTime.Now;
                article.Body = Sanitizer.GetSafeHtmlFragment(article.Body);

                _db.Entry(article).State = EntityState.Modified;
                _db.SaveChanges();
                return RedirectToAction("Index", "Home");
            }
            return View(article);
        }

        // User not allowed to edit
        return RedirectToAction("Index", "Home");   
    }
Run Code Online (Sandbox Code Playgroud)

编辑视图是否有帮助:

. . .
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>Article</legend>

    <p>
        <input type="submit" value="Save" …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc model-binding viewmodel valueinjecter

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

为什么模型绑定比过滤器更早发生

在看完Simon的这篇优秀博客文章后,我发现模型绑定比过滤器执行更早(甚至在授权过滤器之前).如果请求未被授权,则应尽可能早地拒绝该请求,在这种情况下,我更喜欢在模型绑定过程之前运行授权过滤器.此外,通过这种方式,我们可以节省时间,避免扫描请求,创建模型实例和执行验证.

有什么理由我根本不明白为什么MVC请求处理管道设计的方式是模型绑定应该在过滤器之前发生?

asp.net-mvc authorization model-binding action-filter

10
推荐指数
1
解决办法
2885
查看次数

AngularJS:带键值的ng-repeat - 更新对象

我正在渲染键:使用ng-repeat的值对象数组,如下所示:

<div ng-controller="mainCtrl">    
  <div ng-repeat="record in records">
    <div ng-repeat="(key, value) in record">
        <input ng-model="key" />: <input ng-model="value" />
    </div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

var mainCtrl = function($scope){
$scope.records = [
        {'key1':'val1'},
        {'key2':'val2'}
        ];
}
Run Code Online (Sandbox Code Playgroud)

问题是无法通过输入标签更新键和值.由于某种原因,在使用ng-repeat迭代(键,值)之后,它成为单向绑定.

小提琴: http ://jsfiddle.net/BSbqU/1/

我怎样才能使它成双向绑定?或者我应该以不同的方式处理此问题然后嵌套ng-repeat?

model-binding angularjs angularjs-ng-repeat

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

自定义布尔参数绑定

我有一个WebApi方法,像这样:

public string Get([FromUri] SampleInput input)
{
    //do stuff with the input...
    return "ok";
}
Run Code Online (Sandbox Code Playgroud)

输入定义如下:

public class SampleInput
{
    // ...other fields
    public bool IsAwesome { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

实际上,它可以正常工作:如果我传入&isAwesome=true查询字符串,则参数将使用值进行初始化true.

我的问题是,我想接受这两个 &isAwesome=true&isAwesome=1作为true价值观.目前,第二个版本将导致IsAwesomefalse输入模型.


在阅读有关该主题的各种博客文章之后,我尝试的是定义HttpParameterBinding:

public class BooleanNumericParameterBinding : HttpParameterBinding
{
    private static readonly HashSet<string> TrueValues =
        new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase);

    public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor)
    {
    }

    public override Task ExecuteBindingAsync( …
Run Code Online (Sandbox Code Playgroud)

c# model-binding asp.net-web-api2

10
推荐指数
1
解决办法
3900
查看次数

asp.net web api有[Bind(Exclude ="Property")]之类的东西吗?

我试图在web api控制器中从我的Post Action中排除一个属性,是否有像[Bind(Exclude="Property")]asp.net web api 这样的东西?

这是我的模特:

public class ItemModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想在Post Action中排除Id,因为它是自动生成的,但我需要在Get Action中返回它.

我知道我可以有两个模型,一个用于我的Post动作,一个用于我的Get动作,但我只想用一个模型做这个.

model-binding asp.net-web-api

10
推荐指数
1
解决办法
941
查看次数

如何在EF中配置一对多关系

我有以下型号

public class PageConfig : Base
{
    // Properties Etc..

    public ICollection<Image> ScrollerImages { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的方法是使用联结表{PageConfigID,ImageID}进行绑定.

在我的模型活页夹中我尝试了以下..

modelBuilder.Entity<PageConfig>()
    .HasMany(x => x.ScrollerImages)
    .WithMany()
    .Map(x =>
    {
        x.ToTable("junc_PageConfigScrollerImages");
        x.MapLeftKey("PageConfigID");
        x.MapRightKey("ImageID");
    });
Run Code Online (Sandbox Code Playgroud)

这导致图像的空集合.

如何将这些图像绑定到PageConfig模型?

编辑

大多数问题是由于用户错误.这发生在你身上......

检查数据库中的键约束是否已正确设置.
模型上的ICollection NEEDS是虚拟的.

c# entity-framework one-to-many model-binding junction-table

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