0

目標は、すべての連絡先を自動的に保存する 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がオブジェクトだからだと思います。オブジェクトからどのように暗黙的に変換しますか?

ありがとう。

4

1 に答える 1

1

変換を呼び出している型が であるため、例外は確かに発生しますobject

objectまた、基本型から暗黙的な変換を作成することもできません。暗黙的なコンバーターを使用する前に、正しい型にキャストする必要があります。

私は、暗黙的/明示的な変換演算子を使用することはあまり好きではありません。私は AutoMapper のような適切なマッピング ソリューションを好みます。

于 2013-04-02T15:34:41.237 に答える