T4MVC - Actions with model binding - how to get a fully qualified strongly-typed URL string to another Controller?

StackOverflow https://stackoverflow.com/questions/11056548

Domanda

I'm running Visual Studio 2012 RC with the .Net 4.5 bits with T4MVC.

I'm in an Action method for my AccountController and I want to generate a fully qualified URL for another controller which looks something like this;

public partial class ConfirmEmailController : Controller
{
    // ...

    [AllowAnonymous]
    [HttpPost]
    public virtual ActionResult Confirm(ConfirmEmailModel model)
    {
         //...
    }
    // ...
}

So I want to call a function (when inside my AccountController Action method that creates a link I can email;

    private string GetEmailConfirmationUrl(MembershipUser aUser, bool confirm)
    {
        string code = aUser.ProviderUserKey.ToString();
        var model = new ConfirmEmailModel() { Code = code, Confirm = confirm };

        Url.Action(MVC.ConfirmEmail.Confirm(model); // very typesafe but doesn't work
    }

However, similar to this other members's experience Strongly-typed T4MVC Action/ActionLink I simply get the name of the model class "www.Models.ConfirmEmail"

I'm using the latest T4MVC bits but it doesn't look like there's been any change here since that post.

I don't necessarily want to be able to contruct and pass in models like this, all I want is to construct a full URL in a strongly typed, type-safe fashion.

I know this works;

Url.Action(MVC.ConfirmEmail.Confirm().AddRouteValues(new ConfirmEmailModel() { Code = code, Confirm = confirm }));

But that's no good because it doesn't validate that the model parameters I'm passing in are even valid for that controller, I could pass them to any controller (I've already made that mistake).

Is there any other way of achieving this or must I put a parameter list in my Confirm() action?

È stato utile?

Soluzione

I don't think you can do that.

If you look at the code generated by T4MVC you will see that there is nothing that would 'reverse' the logic from your model binder. Basically T4MVC has no knowledge that a model binder is being used.

Edit:

You can use T4MVC to generate the URL, but you need to use the overload that T4 generated. So in your case just

Url.Action(MVC.ConfirmEmail.Confirm());

That is enough to generate URL. The actual value of the parameter will be created at runtime based on your model binding.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top