ASP.Net MVC 3中的远程验证:如何在Action方法中使用AdditionalFields

32

我一直在使用新的ASP.Net MVC 3的RemoteAttribute将远程调用发送到具有单个参数的操作方法。现在我想使用AdditionalFields属性传递第二个参数:

[Remote("IsEmailAvailable", "Users", AdditionalFields = "InitialEmail")]

其中IntialEmail是视图中的隐藏字段。操作如下:

public JsonResult IsEmailAvailable(
            string email,
            string InitialEmail)
{
//etc.
}

当视图被渲染时,隐藏字段会被填充,但当远程触发Action方法时,该值为空字符串。

我已经看到在其他地方大小写敏感可能是一个问题,因此我确保Action方法的两个参数具有相同的大小写。

还有其他建议吗?这个AdditionalFields以前被称为Fields。

谢谢,

Beaudetious


你能添加视图的标记吗?附加字段需要与视图中的字段之一匹配。你是否为电子邮件获取了一个值,但对于InitialEmail却是空字符串?要进行调查,使用Firebug进行调试很有帮助,你可以看到发送回服务器的请求。它应该具有查询字符串,用于指定你的操作所期望的字段。类似于?email=blah?InitialEmail=blah... - Joe Cartano
另一个问题的答案也解决了这个问题:https://dev59.com/K1PTa4cB1Zd3GeqPi2nB 那么我应该如何标记这个问题已解决? - beaudetious
3个回答

60

奇怪,这对我起作用:

模型:

public class MyViewModel
{
    [Required]
    [Remote("IsEmailAvailable", "Home", AdditionalFields = "InitialEmail")]
    public string Email { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }

    public ActionResult IsEmailAvailable(string email, string initialEmail)
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
}

视图:

@model AppName.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
@using (Html.BeginForm())
{
    @Html.TextBoxFor(x => x.Email)
    @Html.ValidationMessageFor(x => x.Email)
    <input type="hidden" name="InitialEmail" value="foo@bar.com" />
    <input type="submit" value="OK" />
}

据我所知,在ASP.NET MVC 3 RC2中,这种远程验证存在一些错误,这些错误在RTM中已经被修复。


6
Darin:你和你的“这对我可行”的态度总有一天会害死我的。 ;) - beaudetious
1
我不知道有任何差异。 - Darin Dimitrov
2
我找到了。你必须在控制器中设置这个属性:[OutputCache(Location = OutputCacheLocation.None, NoStore = true)] - Pittfall
1
@Pittfall 覆盖 RemoteValidation 实现 :P - Elisabeth
嗨@DarinDimitrov为什么用“ActionResult”而不是“JSONResult”?我们正在返回JSON。 - SurajS
显示剩余5条评论

2

您的隐藏字段必须与要验证的字段位于同一表单中(就像在Darin的示例中一样),否则隐藏字段的值将不会作为参数发送到验证操作方法“public ActionResult IsEmailAvailable(string email, string initialEmail)”


0

函数 IsEmailAvailable(string email, string initialEmail) 的参数 email 应该与属性 Email 完全相同,且均为电子邮件地址。


大小写不重要。MVC框架将其映射为不区分大小写。 - Fred

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接