boss
boss

Reputation: 1606

Pass Value from View To Controller in Asp.net MVC

I am trying to pass a message to another view (actually same controller) I can do it well but there is a problem for me..

I am new on web and it doesnt seem good ..

problem

and here my c# code

if (createStatus == MembershipCreateStatus.Success)
{        
     string registrationMessage = "You have registered successfully";

     return RedirectToAction("KurumsalGiris", new { message = registrationMessage }); 
}


[AllowAnonymous] //sonradan eklendi
public ActionResult KurumsalGiris(string message="")
{

    if (User.Identity.IsAuthenticated)
        return Content("Zaten giriş yapmışsınız");

    ViewBag.RegistrationMessage = message;

    return View();
}

and here html side

@model E_Cv.Models.LogOnModel

@{
    ViewBag.Title = "Kurumsal Giriş";
}

<h2>Kurumsal Giriş</h2>

<h2>@ViewBag.RegistrationMessage</h2>

<p>
  Please enter your user name and password.
  @Html.ActionLink("Yeni Kurum Kaydı", "KurumsalKayit")
   if you don't have an account.
</p>

so I dont know how to pass value to another view with different way.. I dont want to show this kind of message on address bar and user musnt change it.

Secondly Could I do it with "Get" Method?

Upvotes: 1

Views: 7176

Answers (4)

Ricardo Rodrigues
Ricardo Rodrigues

Reputation: 2258

What you would do is instead of returning a RedirectToAction you could return the View directly: (second parameter is a model, where you can use the same model class E_Cv.Models.LogOnModel adding a RegistrationMessage property to it)

return View("<name of the view>",
   new E_Cv.Models.LogOnModel {
     RegistrationMessage = "You have registered successfully"
   });

or keep the data in the ViewBag like you have done:

ViewBag.RegistrationMessage = "You have registered successfully";
return View("<name of the view>");

regarding your last question, give the message is showing in your URL, you are using the GET method, if you return a View instead of a redirect, it'll avoid showing anything in the URL

Upvotes: 2

Rik Leigh
Rik Leigh

Reputation: 1328

You should use TempData in this scenario

if (createStatus == MembershipCreateStatus.Success)
{        
    TempData["Message"] = "You have registered successfully";

    return RedirectToAction("KurumsalGiris"); 
}

And then in your view

@if (TempData["Message"] != null) 
{
    <h2>@TempData["Message"]</h2>
}

Or if you want to do it in the controller, just keep your view the same as it is at the moment and set ViewBag.RegistrationMessage in the controller

ViewBag.RegistrationMessage = TempData["Message"];

Upvotes: 2

Katie Kilian
Katie Kilian

Reputation: 6985

If the question is how to pass data between controllers without using the querystring, then one option is the Session object.

if (createStatus == MembershipCreateStatus.Success)
{        
    Session["Message"] = "You have registered successfully";

    return RedirectToAction("KurumsalGiris"); 
}


[AllowAnonymous] //sonradan eklendi
public ActionResult KurumsalGiris(string message="")
{
    if (User.Identity.IsAuthenticated)
        return Content("Zaten giriş yapmışsınız");

    ViewBag.RegistrationMessage = (string) Session["Message"];

    return View();
}

However, I agree with @Jonathan Wood below that this is not necessarily the best approach to the particular problem you are attempting to solve. Still, as a general technique, it is worth knowing about.

Upvotes: 1

Jonathan Wood
Jonathan Wood

Reputation: 67195

Why don't you just return a different view rather than redirecting? In fact, the code the posted in the first place should be posting to a controller that returns a view for a successful login.

In fact, why are you redirecting to a page that asks the user to login if they've just logged in?

Other possible options include encrypting the string in the URL, or just passing a flag in the URL that the controller translates into the corresponding string.

Upvotes: 3

Related Questions