C#MVC将字符串中的变量绑定到模型

时间:2015-01-07 12:29:07

标签: c# asp.net-mvc properties

C# MVC中,您可以使用模型绑定自动将变量解析为模型。

public class RegistrationForm {
 string Name {get;set;}
 string Address {get;set;} 
}

public ActionResult Register(RegistrationForm register) {
...
}

如果我传递了NameAddress个变量,它们可以直接在register对象中使用。

如果变量包含在字符串中,是否可以手动调用此绑定? EG:

var s = "name=hugo&address=test";

//dosomething to get RegistrationForm register

//register.Name == hugo

我知道我可以使用NameValueCollection获得HttpUtility.ParseQueryString(s);,然后使用反射获取RegistrationForm的属性并检查值是否存在,但我希望我可以使用实际值绑定方法MVC使用。

4 个答案:

答案 0 :(得分:1)

MVC绑定工作基于ViewModelRegistrationForm类)的属性名称。

所以你绝对正确,如果你使用 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模型绑定器完全不同。