标签: model-binding

ASP.net Web API中MVC的DefaultModelBinder的等价物是什么?

我想在ASP.Net Web API中创建一个自定义模型绑定器.有关如何从头开始执行此操作的大量资源,但我想利用现有功能.

我在codeplex中查看了源代码,可以在那里看到大量的模型绑定器,但大多数是密封的......即使这样,我也无法确定在哪种情况下使用哪一个.

这是我的api方法标题:

public async Task<HttpResponseMessage> Post(long appId, [FromBody]Field field)
Run Code Online (Sandbox Code Playgroud)

我想要做的是基本上在填充所有基本属性后拦截模型绑定器,然后根据我将在客户端设置的http请求标头设置一些额外的值.

正如我所说,我很乐意创建自定义模型绑定器和模型绑定器并将它们连接起来,我遇到问题的是试图重用现有的功能.

谢谢,皮特

c# rest model-binding asp.net-web-api

21
推荐指数
1
解决办法
6395
查看次数

如何使ASP.Net MVC模型绑定器将传入日期视为UTC?

我正在向MVC控制器发布一个对象.该对象包含一个名为StartDt的字段,在客户端上它是本地时间的javascript Date对象.

当我在对象上调用JSON.stringify并使用jQuery的ajax方法将其POST到服务器时,我可以在Firebug中看到发送到服务器的是一个ISO字符串,如"1900-12-31T13:00:00.000Z",我相信应该是UTC格式的本地时间.

当我查看控制器中的DateTime字段时,它看起来像是回到本地时间而不是UTC.我怎样才能解决这个问题?

我想存储来自客户端的日期的UTC版本.

javascript asp.net-mvc json model-binding

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

如何将多个参数从ajax调用传递给MVC控制器

我有如下控制器:

public ActionResult Save(string input, string name) {
    //Some code
    return PartialView();
}
Run Code Online (Sandbox Code Playgroud)

我需要对此控制器方法进行ajax调用并传递两个参数input和value

我的ajax调用如下所示:

$.ajax({
    url: '/Home/Save',
    type: 'POST',
    async: false,
    dataType: 'text',
    processData: false,
    data: "input=" + JSON.stringify(data) + "&name =" + $("#name").val(),
    success: function (data) {
    }
});
Run Code Online (Sandbox Code Playgroud)

我无法将值传递给name参数.. name参数中的值变为null ..请帮助我..提前感谢

ajax asp.net-mvc jquery model-binding

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

如何在数据操作方法之外调用TryUpdateModel

  • VS2012,.NET 4.51

我有一个用户控件,其中包含ListView使用模型绑定的用户控件.到现在为止还挺好.我想根据用户操作视图模式的方式显示对象列表.为此,我有一个名为Roles的公共财产.但是,当我TryUpdateModel()从里面打电话时,我收到了异常:

TryUpdateModel'必须传递给值提供者,或者必须从使用模型绑定进行数据绑定的控件的数据操作方法内部调用

现在,虽然我明白我可以通过执行以下操作退出编辑模式:

lvData.EditIndex = -1;
Run Code Online (Sandbox Code Playgroud)

然后在UpdateMethod通话中TryUpdateModel(),我想知道如何TryUpdateModel在不必连接方法进行更新的情况下调用.换句话说,如何/在哪里/我为IValueProvider参数提供什么TryUpdateModel().

/// <summary>
///     Initialise the user control
/// </summary>
/// <param name="aRoles">List of roles to display</param>
public void Activate(List<RoleInfo> aRoles)
{
    //List we will be binding
    _ViewModel = new List<MembershipRolesViewModel>();

    //Transfer the supplied list into the view model
    foreach (RoleInfo roleInfo in aRoles)
    {
        _ViewModel.Add(new MembershipRolesViewModel
        {
            RoleDisplayName = roleInfo.RoleDisplayName,
            RoleHint = roleInfo.RoleHint,
            RoleName = roleInfo.RoleName,
            RoleSelected …
Run Code Online (Sandbox Code Playgroud)

c# asp.net webforms model-binding

20
推荐指数
1
解决办法
1997
查看次数

用于泛型类型的ASP.NET MVC模型绑定器

是否可以为泛型类型创建模型绑定器?例如,如果我有一个类型

public class MyType<T>
Run Code Online (Sandbox Code Playgroud)

有没有办法创建一个适用于任何类型的MyType的自定义模型绑定器?

谢谢,内森

c# generics asp.net-mvc model-binding

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

Web窗体模型绑定:如何省略不可见控件的绑定?

我正在使用.NET Framework版本4.5.1的WebForms的新模型绑定功能.我希望实现的是,根据一些条件排除一些双向绑定.

我非常喜欢Scott Guthrie撰写的(希望现在很有名)博客文章系列.我使用Web Forms Model Binding Part 3:更新和验证(ASP.NET 4.5系列)中的第二种方法实现编辑页面

这就是我所拥有的:(简化,在ElementEdit.aspx中):

<asp:FormView runat="server" ID="FormViewElement" RenderOuterTable="false" DefaultMode="Edit" DataKeyNames="ElementId"
    ItemType="Business.Entities.Element"
    SelectMethod="GetElement"
    UpdateMethod="UpdateElement">
    <EditItemTemplate>
        <asp:Panel runat="server" DefaultButton="ButtonSpeichern">
            <fieldset>
                /*some databound controls*/
                <asp:Panel runat="server" Visible="<%# !Item.CurrentElementData.SomeCondition() %>">
                    /*more databound controls*/
                </asp:Panel>
                /*the submit button ("ButtonSpeichern")*/
            </fieldset>
        </asp:Panel>
    </EditItemTemplate>
</asp:FormView>
Run Code Online (Sandbox Code Playgroud)

如您所见,包裹的内部面板上的可见性存在"更多数据绑定控制"的条件.当条件为真时,这些应该仅绑定,并且它们是可见的.否则它们不应该绑定而不能更改值.

更新的工作方式类似于Scott的帖子(简化,在xxPage.cs中),它是Type Element的通用基类:

protected virtual bool UpdateEntity(int id) {
    T existing = UseCase.GetItem(id); //gets the original element    

    TryUpdateModel(existing); //SHOULD NOT update the invisible databound controls, but …
Run Code Online (Sandbox Code Playgroud)

c# asp.net controls webforms model-binding

19
推荐指数
1
解决办法
1196
查看次数

在调用UpdateModel()时如何从绑定中排除属性?

我有一个视图模型发送到我的控制器的编辑操作.ViewModel包含对EntityObjects的引用.(是的,我很喜欢它,并且不需要复制viewmodel中的所有实体属性).

我实例化视图模型,然后调用UpdateModel.我得到一个属性为"null"的错误,这很好,因为它是一个相关的模型.我试图在模型绑定期间排除属性绑定.在调试它时,我在实体中看到模型绑定器试图将属性的值设置为null.

这是我的编辑操作:

var model = new SimplifiedCompanyViewModel(id);

var excludeProperties = new string[] { 
   "Entity.RetainedEarningsAccount.AccountNo"
   ,"Property.DiscountEarnedAccount.ExpenseCodeValue"
   ,"Entity.EntityAlternate.EntityID"
   ,"Property.BankAccount.BankAccountID"
   ,"Entity.PLSummaryAccount.AccountNo"
   ,"Property.RefundBank.BankAccountID"
   ,"Company.Transmitter.TCC"
};

try
{
    UpdateModel<SimplifiedCompanyViewModel>(model, String.Empty, null, excludeProperties);

    if (ModelState.IsValid)
    {
       //db.SaveChanges();
    }
       return RedirectToAction("Index");
}
catch
{
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

我已经看了一些关于指定"前缀"的其他问题,但我不认为这是问题,因为我告诉它绑定到viewmodel实例而不仅仅是实体对象.

我是否正确排除了这些属性?奇怪的是,这件事似乎只发生了.我怀疑这可能是一个问题,实际上没有与我的实体相关的退款银行.但我有其他相关的项目不存在,并没有看到相同的问题.

更多信息...因为我告诉我模型设计不好.

本公司与BankAccount有关.公司视图显示当前相关的BankAccount.BankAccountId,并且BankAccount.Key有一个隐藏字段.我使用jQueryUI自动完成功能提供显示BankAccount.BankAccountId的银行帐户下拉列表,当选择一个时,jQuery代码会更改隐藏字段以获得正确的Key值.因此,当发布此消息时,我不希望修改当前的银行账户BankAccountID,因此我希望它跳过绑定该字段.

如果我在模型中排除BankAccountId,那么在BankAccount编辑视图中,用户永远无法更改BankAccountId,因为它不会被绑定.我不确定这表明模型设计不佳.

model-binding asp.net-mvc-3

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

MVC3 - 包含复杂类型列表的Viewmodel

如果以前曾被问过,请道歉; 有一百万种方法来表达它,因此寻找答案已经证明是困难的.

我有一个具有以下属性的viewmodel:

public class AssignSoftwareLicenseViewModel
{
    public int LicenseId { get; set; }
    public ICollection<SelectableDeviceViewModel> Devices { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

SelectableDeviceViewModel的简化版本是这样的:

public class SelectableDeviceViewModel
{
    public int DeviceInstanceId { get; set; }
    public bool IsSelected { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我的视图中,我试图在输入表单中显示Devices属性的可编辑复选框列表.目前,我的View看起来像这样:

@using (Html.BeginForm())
{
    @Html.HiddenFor(x => Model.LicenseId)
    <table>
        <tr>
            <th>Name</th>
            <th></th>
        </tr>
        @foreach (SelectableDeviceViewModel device in Model.Devices)
        {
            @Html.HiddenFor(x => device.DeviceInstanceId)
            <tr>
                <td>@Html.CheckBoxFor(x => device.IsSelected)</td>
                <td>@device.Name</td>
            </tr>
        }
    </table>

    <input type="submit" …
Run Code Online (Sandbox Code Playgroud)

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

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

ModelBinding与Steve Sandersons的BeginCollectionItem

我正在使用Steve Sandersons BeginCollectionItem扩展来帮助绑定项目列表.这适用于原始类型.我遇到的问题是,对于我编写的自定义模型绑定器,我无法看到如何生成我绑定的项目的全名和索引.

目前我的模型绑定器如下所示:

public class MoneyModelBinder : DefaultModelBinder 
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Amount");

        if (valueResult != null)
        {
            var value = valueResult.AttemptedValue;
            var currencyCode = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Iso3LetterCode").AttemptedValue;

            var money = (Money) bindingContext.Model;

            Money parsedValue;
            if (String.IsNullOrEmpty(value))
            {
                money.Amount = null;
                return;
            }

            var currency = Currency.FromIso3LetterCode(currencyCode);

            if (!Money.TryParse(value, currency, out parsedValue))
            {
                bindingContext.ModelState.AddModelError("Amount", string.Format("Unable to parse {0} as money", value));
            }
            else
            {
                money.Amount = parsedValue.Amount;
                money.Currency …
Run Code Online (Sandbox Code Playgroud)

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

18
推荐指数
1
解决办法
670
查看次数

动态地将Angularjs绑定到新创建的html元素

我有一个带有多个标签的标签页,一旦点击就会调用服务来返回一些数据.其中一些数据返回html表单并且非常随机.我想收集输入的值,并通过服务将数据发送回服务器.我遇到的问题是我无法从动态创建的html中的输入元素中获取数据.

我创建了一个Plunker来展示问题所在.请注意,html值可以随时更改,因此硬编码html将无法正常工作.这里是来自plunker的代码,但请查看plunker以获得最佳视图.

app.js

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope, $sce, $compile) {
    $scope.name = 'World';
    $scope.html = "";

    $scope.htmlElement = function(){
        var html = "<input type='text' ng-model='html'></input>";
        return $sce.trustAsHtml(html);
    }

});
Run Code Online (Sandbox Code Playgroud)

的index.html

<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0-rc.3/angular.js"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>

    <div ng-bind-html="htmlElement()"></div>

    {{html}}

  </body>

</html>
Run Code Online (Sandbox Code Playgroud)

model-binding angularjs

18
推荐指数
2
解决办法
5万
查看次数