Что может заставить этот пользовательский XML ModelBinder не десериализовать мой XML POST? - PullRequest
2 голосов
/ 14 июля 2011

Модель

public class SimpleUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserName { get; set; }
    public int Role { get; set; }
    public bool isActive { get; set; }

    public string Groups { get; set; }
 }

The BinderProvider

public class SimpleUserProvider : IModelBinderProvider
{
    public IModelBinder GetBinder(Type modelType)
    {
        var contentType = HttpContext.Current.Request.ContentType;

        if (string.Compare(contentType, @"text/xml", StringComparison.OrdinalIgnoreCase) != 0)
        {
            return null;
        }

        return new SimpleUserBinder();
    }
}

ModelBinder

public class SimpleUserBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var modelType = bindingContext.ModelType;
        var serializer = new XmlSerializer(modelType);

        var inputStream = controllerContext.HttpContext.Request.InputStream;

        return serializer.Deserialize(inputStream);
    }
}

Application_Start () в Global.asax.cs

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        ModelBinderProviders.BinderProviders.Add(new SimpleUserProvider());

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

Акция

[HttpPost]
    public ActionResult Create(SimpleUser u)
    {
        //simple output for testing bind

        return Content(u.FirstName + ", " + u.LastName + ", " + u.UserName + ", " + u.Role.ToString() + ", " + u.isActive + ", {" + u.Groups + "}", "text/plain");
    }

Тем не менее, когда я отправляю запрос «text / xml», содержащий этот XML:

<SimpleUser>
<FirstName>John</FirstName>
<LastName>Smith</LastName>
<UserName>jsmith@someland.com</UserName>
<Role>3</Role>
<isActive>true</isActive>
</SimpleUser>

Все, что я получаю, это:

,,, 0, False, {}

Я подписался на этот пост , Чего мне здесь не хватает?

1 Ответ

4 голосов
/ 15 июля 2011

Что мне здесь не хватает?

Вам не хватает для сброса потока перед его использованием:

var inputStream = controllerContext.HttpContext.Request.InputStream;
inputStream.Position = 0;
return serializer.Deserialize(inputStream);

или используйте XmlReader :

using (var inputStream = controllerContext.HttpContext.Request.InputStream)
using (var reader = XmlReader.Create(inputStream))
{
    return serializer.Deserialize(reader);
}
...