Modificar dados de postagem com uma extensão MVC personalizada?
-
23-09-2019 - |
Pergunta
Então, estou pensando em escrever algumas extensões MVC personalizadas e a primeira que estou tentando enfrentar é um formattedTextBox para lidar com coisas como moeda, datas e horários. Eu tenho a renderização dele funcionando perfeitamente, formatando -a, trabalhando com tipos fortes e tudo o que tudo dourado. No entanto, o problema em que estou me encontrando é limpar o material formatado quando a página publica os dados de volta.
Tomemos, por exemplo, um formato de moeda. Vamos usar o USD para esses exemplos. Quando um objeto tem uma propriedade como decimal, o valor seria 79.95
. Sua visão de edição seria algo como:
<%= Html.FormattedTextBox(model => Model.Person.HourlyWage, "{0:C}") %>
Tudo isso é bom e bom para a solicitação de get, mas após o post, o valor será $79.95
, que quando você atribui a esse decimal, fica descontente muito rapidamente e acaba empurrando um 0
lá.
Então, minha pergunta é: como faço para que o código trabalhe em algum lugar para trabalhar com esse valor antes que a estrutura do MVC vá e comece a empurrá -lo de volta ao meu viewmodel? Eu prefiro que isso seja feito no lado do servidor que o lado do cliente.
Obrigado!!
Solução
Uma solução seria escrever um Adorável do modelo personalizado que poderá converter o Bind $79.95
para um campo decimal em seu modelo. Outra solução é fazê -lo no lado do cliente. Em um jQuery form.submit
Manipulador Você pode modificar os valores dos campos de entrada a serem publicados.
Outras dicas
Você pode usar ligantes de modelos personalizados Para enfiar os dados postados em um objeto.
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(
[ModelBinder(typeof(YourModelBinderAttribute))]YourClass obj)
{
// your code here
return View();
}
public class MessageModelBinderAttribute : IModelBinder
{
#region IModelBinder Members
public object BindModel(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
YourClass obj = new YourClass();
ValueProviderResult result;
if (bindingContext.ValueProvider.TryGetValue(
"YourPostedInputName", out result))
{
obj.Price = result.AttemptedValue;
}
return message;
}
#endregion
}