32

I've been using the new ASP.Net MVC 3 RemoteAttribute to send a remote call to an action method that had a single parameter. Now I want to pass in a second parameter using the AdditionalFields property:

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

Where IntialEmail is a hidden field in the view. The action looks like so:

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

When the view is rendered, the hidden field is populated, but when the Action method is triggered remotely, the value is an empty string.

I've seen elsewhere case sensitivity may be an issue, so I've ensured the Action method has the same case for both parameters.

Any other suggestions? This AdditionalFields used to be called Fields.

Thanks,

Beaudetious

2
  • Can you add the markup of your view? The additional field needs to match one of the fields in your view. Do you get a value for email but an empty string for InitialEmail? To investigate it is helpful to debug with firebug and you can see the request that is sent back to the server. It should have a querystring for the fields that your action is expecting. Something like ?email=blah?InitialEmail=blah... Commented Jan 22, 2011 at 1:21
  • The answer to another one of my questions resolved this one too: stackoverflow.com/questions/4696276/… So how should I mark this question answered? Commented Jan 31, 2011 at 17:50

3 Answers 3

60

Strange. It works for me:

Model:

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

Controller:

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);
    }
}

View:

@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="[email protected]" />
    <input type="submit" value="OK" />
}

IIRC there was some bug in ASP.NET MVC 3 RC2 with this remote validation that was fixed in the RTM.

Sign up to request clarification or add additional context in comments.

10 Comments

Darin: You and your "it works for me" is going to be the death of me one day. ;)
Seriously though, print the value of InitialEmail in the IsEmailAvailable method to the Output window. You'll see it's blank. I am able to fire the remote method, but the additional parameter has no value.
I am not aware of any differences.
I found it. you have to set this attribute in the controller [OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
@Pittfall Override the RemoteValidation implementation :P
|
2

Your hidden field must be inside the same form as the field your are validating ( like it is in Darin's example ), otherwise the hidden field's value will not be sent as parameter to the validation action method "public ActionResult IsEmailAvailable(string email, string initialEmail)"

Comments

0

function IsEmailAvailable(string email, string initialEmail) param email should as Email which exactly same as Property Email.

1 Comment

Case does not matter. The MVC framework maps it case insensitive.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.