标签: model-binding

Asp.NET MVC模型绑定 - 使用绑定参数属性为简单类型分配前缀

我有一个.net mvc应用程序,其控制器操作接受用户注册帖子.我有以下UI字段:emailaddress,firstname,lastname,password和confirmpassword.其中一些字段不属于模型对象(即确认密码不属于用户模型,仅属于密码).我的注册表位于与登录表单相同的视图中.所以我必须在同一个视图上使用独立的表单,每个表单都返回不同的操作.

我想我可以为表单元素分配前缀,以分隔寄存器和登录之间的相似字段.我遇到的问题是验证,如果发生错误,视图被重新加载,显示验证消息,但是像电子邮件(存在于登录和注册中)这样的字段都会填充先前输入的地址.另外,我在登录和注册字段上面都有一个验证摘要.注册期间发生错误时,将使用错误消息填充两个验证摘要.我认为为字段分配前缀(register.fieldname和login.fieldname)可能有助于解决这些问题.

因此,当register操作处理post时,它不再找到注册表单字段的值,而是返回null.以下是此操作使用的方法签名...

关于这里发生的事情的任何输入都会很棒.

谢谢杰里米

 public ActionResult Register([Bind(Prefix = "Register")] string emailAddress, [Bind(Prefix = "Register")] string firstName, [Bind(Prefix = "Register")] string LastName, [Bind(Prefix = "Register")] string password, [Bind(Prefix = "Register")] string confirmPassword)
Run Code Online (Sandbox Code Playgroud)

以下是我的ui,它代表注册表格....

<h2>Create a New Account</h2>
  <p>
      Use the form below to create a new account. 
  </p>
  <p>
      Passwords are required to be a minimum of <%=Html.Encode(ViewData["PasswordLength"])%> characters in length.
  </p>
  <%= Html.ValidationSummary() %>

  <% using (Html.BeginForm("register", "account")) { %>
    <div>
      <fieldset>
        <legend>Account Information</legend>

        <table>
          <tr>
            <td><label for="EmailAddress">Email …
Run Code Online (Sandbox Code Playgroud)

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

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

在ASP.NET MVC中保存ViewModel

我有一个由许多用户控件组成的页面.此页面的视图模型相当复杂.

public class ComplexViewModel
{
    public ObjectA ObjectAProperty { get; set; }
    public List<Things> ListOfThings { get; set; }
    public List<ThingCategories> ListOfThingCategories { get; set; }
    public List<ThingTypes> ListOfThingTypes { get; set; }
    public List<ThingOptions> ListOfThingOptions { get; set; }
    public int ChosenThingCategoryId { get; set; }
    public int ChosenThingTypeId { get; set; }
    public int ChosenThingOptionId { get; set; }
    public OtherObject ObjectData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

此页面还有一个PostModel,其中包含有关筛选,排序等的信息.

    public class SimplePostModel
{
    public int ChosenThingCategoryId { get; set; …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc model-binding viewmodel

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

模型绑定器究竟做了什么?如何有效地使用它?

我正在研究一些东西,并在buildstarted.com上看到关于模型粘合剂的博客文章.它实际上对我的目的来说非常好,但我不确定幕后会发生什么.我做的是创建一个名为的自定义ModelBinder USerModelBinder:

public class UserModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue("id");
        MyEntities db = new MyEntities();
        User user = db.Users.SingleOrDefault(u => u.UserName == value.AttemptedValue);
        return user;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的Global.asax.cs我:

ModelBinders.Binders.Add(typeof(User), new UserModelBinder());

我的理解是使用模型绑定器允许我不必在涉及"用户"的每个控制器动作中使用以下行.因此,模型绑定器不会将"id"传递给动作,而是截取id,获取正确的"item"(在我的情况下为User)并将其转发给动作进行处理.

        MyEntities db = new MyEntities();
        User user = db.Users.SingleOrDefault(u => u.UserName == value.AttemptedValue);
Run Code Online (Sandbox Code Playgroud)

我也尝试在我的User类上使用注释,而不是使用Global.asax.cs中的行:

[ModelBinder(typeof(UserModelBinder))]
public partial class User
{
}
Run Code Online (Sandbox Code Playgroud)

我不是在寻找30页的白皮书,但我不知道模型绑定器是如何做到的.我只是想了解从发出请求到发送请求的时间会发生什么.所有这些"只是工作"的东西对我来说是不能接受的,哈哈.另外,使用注释与在Global.asax.cs中添加它有什么区别吗?它们似乎在我的测试中工作相同,但有任何陷阱吗?

annotations model-binding asp.net-mvc-3

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

TimeSpan和"24:00"在Asp.net MVC中解析错误

我的Web应用程序中有一个模态对话框,用户可以在00:00到24:00之间输入时间范围.范围滑块用于选择此范围.

一切都按预期工作,除非用户设置正确的范围句柄以使其值为24:00,默认模型绑定器无法解析此问题TimeSpan.

public class Timing
{
    public TimeSpan Starts { get; set; }
    public TimeSpan Ends { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我被发送回服务器的对象有一个IList<Timing>属性.

所以.问题只是字符串值"24:00"无法解析为TimeSpan实例.是否有可能说服默认模型绑定器识别这样的字符串值?

我想避免在客户端24:00更改为00:00.我知道我有StartsEnds属性,但我的模型验证验证Ends总是大于Starts.手动更改为23:59也很麻烦.基本上可以通过24:00仍然可以在服务器上解析.

asp.net-mvc parsing timespan model-binding

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

如何让ModelBinder为参数返回null?

我有一个POCO,我用它作为MVC3中一个动作的参数.像这样的东西:

我的风格

public class SearchData
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的行动

public ActionResult Index(SearchData query)
{
    // I'd like to be able to do this
    if (query == null)
    {
        // do something
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,query作为SearchData所有属性的实例传递null.我更喜欢我得到一个null,query所以我可以在上面的代码中进行空检查.

我总是可以查看ModelBinder.Any()或只是ModelBinder查看各种键,看看它是否有任何属性query,但我不想使用反射来循环遍历属性query.此外,我只能使用ModelBinder.Any()检查查询是否是我唯一的参数.只要我添加其他参数,该功能就会中断.

使用MVC3中的当前模型绑定功能,是否可以获得将POCO参数返回null的行为?

c# asp.net-mvc model-binding modelbinders

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

如何将值传递给MVC3母版页(_layout)?

我有一个自定义模型绑定器,它检查身份验证cookie并返回值.

public class UserDataModelBinder<T> : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {

        if (controllerContext.RequestContext.HttpContext.Request.IsAuthenticated)
        {
            var cookie =
                controllerContext.RequestContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName];

            if (cookie == null)
                return null;

            var decrypted = FormsAuthentication.Decrypt(cookie.Value);

            if (!string.IsNullOrWhiteSpace(decrypted.UserData))
                return JsonSerializer.DeserializeFromString<T>(decrypted.UserData);
        }

        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我需要使用它,我只需要将它传递给动作.一切正常.

public ActionResult Index(UserData userData)
{
    AccountLoginWidgetVM model = new AccountLoginWidgetVM();
    if (null != userData)
        model.UserData = userData;

    return View(userData);
}
Run Code Online (Sandbox Code Playgroud)

但是,我想在我的母版页中使用它,因为一旦用户登录,我想在每个页面的顶部显示他们的信息.我尝试了一些东西,但是不能让它发挥作用

 @Html.RenderPartial("LoginPartial", ???model here??)  
Run Code Online (Sandbox Code Playgroud)

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

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

下划线字符串模型绑定器

我的印象是,当绑定到复杂模型时,处理所有公共属性并尝试对每个属性进行匹配绑定.

我正在尝试解决变量命名问题以便建模

class Model {
      public string Foo {get;set;}
      public string FooBar {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

与查询字符串很好地配合使用

?foo=foo&foo_bar=foo_bar
Run Code Online (Sandbox Code Playgroud)

有没有比自定义模型绑定器更好的方法?无论如何,我的工作不起作用.简单地跳过了FooBar.

public class StringModelBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var model = base.BindModel(controllerContext, bindingContext);

            if (model != null)
                return model;

            var modelName = Regex.Replace(bindingContext.ModelName, "([a-z])([A-Z])", "$1_$2").ToLowerInvariant();

            var value = bindingContext.ValueProvider.GetValue(modelName);

            return value;
        }

    }
Run Code Online (Sandbox Code Playgroud)

注册

ModelBinders.Binders.Add(typeof(string), new StringModelBinder());
Run Code Online (Sandbox Code Playgroud)

model-binding asp.net-mvc-4

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

ASP.NET MVC 4 - ModelBinder错误

所以我正在玩我的ASP.NET MVC 4解决方案.每件事情都很好,不停地添加东西,但奇怪的事情开始发生.

我的一个Models属性为null,即使我将Json中的项目传递给它.

这是javascript对象/ json传递它:

var obj = {
    "plc": "False",
    "al": ["386", "710"],
    "pl": ["9530", "211", "783"]
};
Run Code Online (Sandbox Code Playgroud)

我正在使用自定义模型绑定器...认为这可能是问题所以我把它关掉了.

尝试使用.NET中的JavaScriptSerializer来查看它是否有效:

var reader = new StreamReader(Request.InputStream);
Request.InputStream.Position = 0;
var readToEnd = reader.ReadToEnd();

var javaScript = new JavaScriptSerializer();
var searchFarmOptions = javaScript.Deserialize<Test>(readToEnd);
Run Code Online (Sandbox Code Playgroud)

得到了所有的属性...... WOOT.

所以我尝试了一个干净的ASP.NET MVC 4解决方案.重现这个bug.

这是来自Index.cshtml视图

@{
    ViewBag.Title = "title";
}

<h1>Title</h1>
Testing ... 
<script src="/Scripts/jquery-1.8.2.min.js" type="text/javascript"></script>
<script>
$(function() {
    var obj = {
        "1pllort": "False",
        "1plc": "true",
        "al": ["386", "710"],
        "pl": ["9530", "211", "783"]
    };

    var …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc model-binding

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

Mvvmcross在代码上绑定片段的子代

我在Xamarin中使用MvvMCross绑定片段代码有一点问题。首先,我想做什么或要做什么:我希望我的解释还可以。我从最低的元素开始。首先,我建立动态的UI。我有很多“模板”。它们定义了我的片段片段,例如Lable和ACTextEdit-Field。

然后,我有很多片段(我的视图)。它们包含此代码片段。在一个单独的类中,我将片段添加到Fragment中,并为其赋予唯一的ID。Ostebaron:

http://blog.ostebaronen.dk/2013/07/fragments-and-viewpager-with-mvx.html

现在,我必须使用Fragement和VieModel创建一个Bindingset。然后,我必须将元素与视图模型中的属性绑定。但我不知道代码中的哪个位置。我试图在HomeView的OncreateView函数中执行此操作,但是它没有用。

有人知道如何解决这个问题或给我一些建议吗?

我选择绑定此:

using Android.OS;
using Android.Views;
using Android.Widget;
using Cirrious.MvvmCross.Binding.BindingContext;
using Cirrious.MvvmCross.Binding.Droid.BindingContext;
using Cirrious.MvvmCross.Droid.Fragging.Fragments;
using TipCalc.Core.ViewModels;

namespace TipCalc.UI.Droid.Views.Fragments
{

    public class TipCalcFragment : MvxFragment
    {
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
           View v = inflater.Inflate(Resource.Layout.view_tip, container, false);
            var edit = v.FindViewById<TextView>(Resource.Id.editTest43);
            var ignore = base.OnCreateView(inflater, container, savedInstanceState);
            var set = this.CreateBindingSet<TipCalcFragment, TipViewModel>();
            set.Bind(edit).To(vm => vm.Tip);
            set.Apply();
            return this.BindingInflate(Resource.Layout.view_tip, null);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且它可能无法在错误的地方工作?

android model-binding mvvmcross xamarin

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

将对象列表绑定到表单

我有一类Signature对象:

public class Signature
    {
        public int SignatureID { get; set; }
        public int FormID { get; set; }
        public string Title { get; set; }
        public string Email { get; set; }
        [Display(Name = "Signed Date:")]
        public DateTime? Date { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我有一Form.cs堂课有一个虚拟的签名列表

public virtual List<Signature> Signatures { get; set; }
Run Code Online (Sandbox Code Playgroud)

在控制器中,通过以下方式填充列表:

form.Signatures = repository.Signatures.Where(s => s.FormID == form.FormID).ToList();
Run Code Online (Sandbox Code Playgroud)

在表单视图中,显示相关签名的列表:

@foreach (var signature in Model.Signatures)
    {
    <div class="text-center">
        <label asp-for="@signature.Title"></label>
        <input asp-for="@signature.Title" /> …
Run Code Online (Sandbox Code Playgroud)

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

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