我有一个.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) 我有一个由许多用户控件组成的页面.此页面的视图模型相当复杂.
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) 我正在研究一些东西,并在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中添加它有什么区别吗?它们似乎在我的测试中工作相同,但有任何陷阱吗?
我的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.我知道我有Starts和Ends属性,但我的模型验证验证Ends总是大于Starts.手动更改为23:59也很麻烦.基本上可以通过24:00仍然可以在服务器上解析.
我有一个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的行为?
我有一个自定义模型绑定器,它检查身份验证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) 我的印象是,当绑定到复杂模型时,处理所有公共属性并尝试对每个属性进行匹配绑定.
我正在尝试解决变量命名问题以便建模
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) 所以我正在玩我的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.
@{
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) 我在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)
并且它可能无法在错误的地方工作?
我有一类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) model-binding ×10
asp.net-mvc ×7
c# ×2
.net ×1
android ×1
annotations ×1
asp.net ×1
asp.net-core ×1
modelbinders ×1
mvvmcross ×1
parsing ×1
timespan ×1
viewmodel ×1
xamarin ×1