目標は、すべての連絡先を自動的に保存する ActionFilter を作成することです。
コード:
ビューモデル
Origem
保存された連絡先のビュー ソースを識別するために使用されます (この場合、 contatoContatoViewModel
と Careersの 2 つのビューのみTrabalheConoscoViewModel
)
public class ContatoViewModel
{
public string Nome { get; set; }
public string Email { get; set; }
public string Assunto { get; set; }
public string Mensagem { get; set; }
public static explicit operator Contato(ContatoViewModel vm)
{
return new Contato { Nome = vm.Nome, Email = vm.Email, PrimeiroContato = DateTime.Now, Origem = OrigemContato.Contato };
}
}
public class TrabalheConoscoViewModel
{
public string Nome { get; set; }
public string Email { get; set; }
public string Mensagem { get; set; }
public HttpPostedFileBase Arquivo { get; set; }
public static explicit operator Contato(TrabalheConoscoViewModel vm)
{
return new Contato{ Nome = vm.Nome, Email = vm.Email, PrimeiroContato=DateTime.Now, Origem = OrigemContato.Candidato };
}
}
フィルター
public class LogContatoAttribute : ActionFilterAttribute
{
private readonly string _paramName;
private object _paramValue = null;
public LogContatoAttribute(string paramName = "vm")
{
_paramName = paramName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionParameters.ContainsKey(_paramName))
_paramValue = filterContext.ActionParameters[_paramName];
else
throw new ArgumentException("Parâmetro não encontrado.", _paramName);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var a = (Contato)_paramValue; //Error!!!!
// Save in database
}
}
アクション
public ActionResult contato()
{
return View(new ContatoViewModel());
}
[HttpPost]
[ValidateAntiForgeryToken]
[LogContato("vm")]
public ActionResult contato(ContatoViewModel vm)
{
if (ModelState.IsValid)
{
new mailController().contato(vm).Deliver();
return RedirectToRoute("Default", new RouteValueDictionary { { "controller", "home" }, { "action", "contato" } });
}
ModelState.AddModelError("", "Não foi possível enviar sua mensagem.");
return View(vm);
}
エラー
System.InvalidCastException was unhandled by user code
HResult=-2147467262
Message=Unable to cast object of type 'CreditoImobiliarioBB.WebSite.ViewModels.ContatoViewModel' to type 'CreditoImobiliarioBB.WebSite.Models.Contato'.
Source=CreditoImobiliarioBB.WebSite
StackTrace:
at CreditoImobiliarioBB.WebSite.Infra.Filters.LogContatoAttribute.OnActionExecuted(ActionExecutedContext filterContext) in w:\Clients\creditoimobiliariobb\website\src\CreditoImobiliarioBB.WebSite\Infra\Filters\LogContato.cs:line 27
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
InnerException:
質問
_paramValue
がオブジェクトだからだと思います。オブジェクトからどのように暗黙的に変換しますか?
ありがとう。