Spitting out a Index view using parameters - c#

I'm using ASP.MVC and trying to learn...
I have the following controller
// get all authors
public ActionResult Index()
{
var autores = autorRepository.FindAllAutores();
return View("Index", autores);
}
// get authors by type
public ActionResult Index(int id)
{
var autores = autorRepository.FindAllAutoresPorTipo(id);
return View("Index", autores);
}
If I try http://server/Autor/1 I get a 404 error. Why is that?
I even tried to create a specific method ListByType(int id) and the correspondent view, but that does not work too (URL: http://server/Autor/ListByType/1)
Any ideas?
EDIT Oh, the http://server/Autor works just fine. The method without parameters is spitting out my view correctly.

Assuming your class is called AutorController, and assuming you have the default route configuration of
{controller}/{action}/{id}
You should be able to request
/Autor/Index/<anything>
However, you seem to be a bit confused on the action methods. You could combine your action methods like so:
public ActionResult Index(int? id)
{
var autores; // I know this wont compile - but without knowing what type FindAllAutoRes returns, I can't make a specific type for this example
if(id.HasValue)
autores = autorRepository.FindAllAutoresPorTipo(id);
else
autores = autorRepository.FindAllAutores();
return View(autores); // Will automatically select the 'Index' View
}
MVC will select the first valid action method that corresponds to your route data - so if you request /Autor/Index/3, you will get the first action method, but since it has no parameters, the id route data is not bound to anything.

Related

View not found from controller

I return the View from my controller start_run1 to a view start_run1
public ActionResult start_run1(int? id) { ....
return(View);
}
I get 404 page not found, even if I try using absolute paths etc etc.
if I add the code it finds the page but model data or ViewBag data doesn't get passed.
public IActionResult start_run1()
{
return View();
}
I have another similar controller function which works without doing this.
Any ideas, Ive tried everything.

how do get header that i set in response object

My action method returns a view. It looks like the following.
public public ActionResult Init(string additionalParams)
{
Response.AddHeader("additionalParams", additionalParams);
return View(model);
}
The view has a form. The form is submitted to another action method
[HttpPost]
public ActionResult InitPost(MyModel model)
{
string additionalParams = Request.Headers.Get("additionalParams"); <--- getting null
}
how do i get the additionalParams in the post? Please help.
So on the Init(), I was using Route attribute routing, that makes urls look like this http://wwww.example.com/23/22/... Apparently this caused issues with the length of url. So I switched to using query string, by removing the route attribute routing. Now with this url, I can pass my additionalParams just fine, http://www.example.com?id=222&otherID=222&additionalParams="whatever"

ASP.NET MVC Attribute Routing - parameter is always null

Recently I have faced the following issue. Let's suppose that we have following controller with GET method inside:
[RoutePrefix("admin-panel")]
public class AdminPanelController : Controller
{
[Route("places/edit/{placeId}")]
public ActionResult EditPlace(int? placeId)
{
return View("EditPlace", new EditPlaceViewModel(...));
}
}
Now we can access this method by url:
(...)/admin-panel/places/edit/123
The problem is that the placeId parameter is always null.
If I change the EditPlace method routing rule to following:
[RoutePrefix("admin-panel")]
public class AdminPanelController : Controller
{
[Route("places/{placeId}/edit")]
public ActionResult EditPlace(int? placeId)
{
return View("EditPlace", new EditPlaceViewModel(...));
}
}
Everything starts working properly - placeId parameter is being passed successfuly.
What am I missing here? Why can't I use first solution?
Thanks in advance!
#update
OK, I've missed that I have the POST methods with the same routing rules which look like:
[HttpPost]
[Route("places/edit/{placeId}")]
[MultipleSubmitButton(Name = "action", Argument = "NextEditStep")]
public ActionResult NextEditStep(int? placeId, EditPlaceViewModel model)
{
// do some operations with posted model
return View("EditPlace", new EditPlaceViewModel(...));
}
[HttpPost]
[Route("places/edit/{placeId}")]
[MultipleSubmitButton(Name = "action", Argument = "PreviousEditStep")]
public ActionResult PreviousEditStep(int? placeId, EditPlaceViewModel model)
{
// do some operations with posted model
return View("EditPlace", new EditPlaceViewModel(...));
}
If I comment them out, the problem walk away, but to be honest - I need it due to form generating. Is there any chance to have those 3 methods with the same routing rules?
I have similar controller with similar 3 methods (1 GET & 2 POSTS) but they do not have any route parameters. Anyway this routing works great and behaves as expected. The only difference is that the first one have route parameters and the second does not.
[Route("places/edit/{placeId: int}")]
Try this
It's possible to use optional parameters in route, like this:
[Route("places/edit/{placeId?}")]
(edit)
https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/#optionals-and-defaults

MVC4 Ignoring [HttpGet] and [HttpPost] attributes

I am attempting to make a simple test website to allow me to list, create, edit and delete customer objects using MVC4.
Inside my controller I have 2 create methods, a Get for when the form loads with the controls, and a Post that actually saves the data.
//
// GET: /Customer/Create
[HttpGet]
public ActionResult Create()
{
return View();
}
//
// POST: /Customer/Create
[HttpPost]
public ActionResult Create(Customer cust)
{
if (ModelState.IsValid)
{
_repository.Add(cust);
return RedirectToAction("GetAllCustomers");
}
return View(cust);
}
However when I run the project and attempt to access the create action I get an error that:
The current request for action 'Create' on controller type 'CustomerController' is ambiguous between the following action methods:
System.Web.Mvc.ActionResult Create() on type [Project].Controllers.CustomerController
System.Web.Mvc.ActionResult Create([Project].Models.Customer) on type [Project].Controllers.CustomerController
My I understand that it can't see the difference between my Get and Post methods, but I have added the attribues. What could be the cause of this and how can I make it work again?
MVC does not authorize you to have 2 action methods with the same name.
BUT you can have 2 action methods with the same URI when the http verb differs (GET, POST). Use the ActionName attribute to set the action name. Don't use the same methods names. You can use any name. A convention is to add the http verb as the method suffix.
[HttpPost]
[ActionName("Create")]
public ActionResult CreatePost(Customer cust)
{
if (ModelState.IsValid)
{
_repository.Add(cust);
return RedirectToAction("GetAllCustomers");
}
return View(cust);
}

Can I share a view in asp.net mvc?

My controller has 2 actions:
Results()
Index()
I want to share the view named index.aspx between these 2 actions.
See my previous post for more information
When I build my link to the page, I assume I cannot send it to Index action as it is expecting a FormCollection type and hence I create a Results action
public ActionResult Results(ClientSearch data, int? page)
{
FormCollection collection = new FormCollection();
collection.Add("FNAme", data.FName);
collection.Add("Lane", data.Lane);
collection.Add("Zip", data.Zip);
collection.Add("Phone", data.Phone);
return Index(page, collection);
}
Not sure I completely understand your question, but if you want to use the same View on different ActionResults, you can:
public ActionResult One() {
// do stuff
return View("Index", myModel);
}
public ActionResult Two() {
// do stuff
return View("Index", myOtherModel); // Same View
}
Just make sure you are providing the same Type for the View (if the View needs a Type at all).
Of course you can. It's up to controller to decide how to react and what view to serve back.
Now that I've read your question to the end :)), well, you can get away with two actions of the same name. The one will be accepting GET commands (initial load of the page), the other will be serving POST requests, perform the necessary action and redirect back to the same View.
public MyController
{
[AcceptVerbs (HttpVerbs.Get)]
public ActionResult Index ()
{
return View ();
}
[AcceptVerbs (HttpVerbs.Post)]
public ActionResult Index (ClientSearch data, int? page)
{
// Process form post
return RedirectToAction ("Index");
}
}

Categories

Resources