使用输出参数并通过引用错误传递

时间:2015-11-16 17:05:47

标签: c# asp.net-mvc

我正在构建一个发送模拟文本消息的MVC应用程序,其中我有两个模型:Contacts和Textmessages。

当用户创建Textmessage时,视图要求他们输入电话号码及其消息。提交后,控制器会在允许创建消息之前验证数据库中是否存在电话号码(联系人)。

如果联系人存在,确认屏幕需要显示消息详细信息(电话号码和消息)以及收件人的姓名。

我正在使用输出参数将名称信息作为字符串发回,但我收到错误:

  

无法在控制器'SMSText.Controllers.TextmessagesController'上调用操作方法'System.Web.Mvc.ActionResult Create(SMSText.Models.Textmessage,System.String ByRef,System.String ByRef)'因为参数'System.String& ; firstName'通过引用传递。

以下是我正在使用的代码:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create( [Bind(Include = 
        "ID,Message,EnteredPrefix,EnteredPhoneNumber")] Textmessage textmessage, 
        out string firstName, out string surName )
    {
        firstName = "";
        surName = "";

        if (ModelState.IsValid)
        {
            bool exists = db.Contacts.AsEnumerable()
                .Where(contact => contact.AreaCode == textmessage.EnteredPrefix && contact.PhoneNumber == textmessage.EnteredPhoneNumber)
                .Count() >0;

            if (exists)
            {
                var contactObj = db.Contacts.First(contact => contact.AreaCode == textmessage.EnteredPrefix && contact.PhoneNumber == textmessage.EnteredPhoneNumber)
                firstName = contactObj.Forename;
                surName = contactObj.Surname;
                db.Textmessages.Add(textmessage);
                db.SaveChanges();

                return RedirectToAction("Details", textmessage );
            }
            else
            {
                return View("Error", textmessage);
            }
        }
        return View(textmessage);
    }

如果我理解错误消息,名称信息将作为参考而不是实际字符串传递,但我不知道如何解决此问题。

如何通过此错误?有没有更好的方法来完成我正在做的事情?

1 个答案:

答案 0 :(得分:1)

通过尝试使用参数,您似乎不必要地过度杀死了呼叫。一旦找到匹配的联系人,然后在视图中使用,为什么不简单地使用ViewData?

var contact  = db.Contacts.AsEnumerable()
                .Where(contact => contact.AreaCode == textmessage.EnteredPrefix && contact.PhoneNumber == textmessage.EnteredPhoneNumber);

if(contact != null && contact.Any())
{
   ViewData["Contact"] = contact.FirstOrDefault();
   db.Textmessages.Add(textmessage);
   db.SaveChanges();
   return RedirectToAction("Details", textmessage );
}


and then in the view you can read it back:

@{
    var contact = (Contact)ViewData["Contact"];
}

请告诉我它是如何为你工作的......