在C# MVC
中,您可以使用模型绑定自动将变量解析为模型。
public class RegistrationForm {
string Name {get;set;}
string Address {get;set;}
}
public ActionResult Register(RegistrationForm register) {
...
}
如果我传递了Name
和Address
个变量,它们可以直接在register
对象中使用。
如果变量包含在字符串中,是否可以手动调用此绑定? EG:
var s = "name=hugo&address=test";
//dosomething to get RegistrationForm register
//register.Name == hugo
我知道我可以使用NameValueCollection
获得HttpUtility.ParseQueryString(s);
,然后使用反射获取RegistrationForm
的属性并检查值是否存在,但我希望我可以使用实际值绑定方法MVC使用。
答案 0 :(得分:1)
MVC绑定工作基于ViewModel
(RegistrationForm
类)的属性名称。
所以你绝对正确,如果你使用 GET HTTP方法将你的属性绑定到字符串,你可以直接写这个:
http://yourSite.com/YourController/Register?Name=hugo&Address=test
它区分大小写,请小心。
或者,如果您使用Razor生成链接,您可以更清楚地编写它:
@Url.Action("Register", new { Name = "hugo", Address = "test"})
答案 1 :(得分:1)
你可以像这里一样模拟传入Modelbinding的HttpContext
http://www.jamie-dixon.co.uk/unit-testing/unit-testing-your-custom-model-binder/
var controllerContext = new ControllerContext();
//set values in controllerContext here
var bindingContext = new ModelBindingContext();
var modelBinder = ModelBinders.Binders.DefaultBinder;
var result = modelBinder.BindModel(controllerContext, bindingContext)
答案 2 :(得分:0)
您可以将字符串转换为JSON对象,然后使用Serializer将JSON对象解析为Model。
答案 3 :(得分:0)
@ Malcolm的anwser是我要求的,所以他得到了学分。但我仍然最终用反射来做,因为在我看来它看起来更清晰,更容易理解发生了什么。
var result = HttpUtility.ParseQueryString(strResponse);
Type myType = GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
foreach (PropertyInfo prop in props)
{
try
{
prop.SetValue(this,
Convert.ChangeType(result[prop.Name], prop.PropertyType, CultureInfo.InvariantCulture),
null);
}
catch (InvalidCastException)
{
//skip missing values
}
catch (Exception ex)
{
//something went wrong with parsing the result
new Database().Base.AddErrorLog(ex);
}
}
<强>声明强> 这对我有用,因为我只获得字符串和小数,不需要任何东西。这与MVC模型绑定器完全不同。