sWhat is wrong with this code? I'm just trying to practice passing a list to my view:
Controller:
public ActionResult About()
{
List<string> ListofColors = new List<string>();
ViewBag.colors.Add("red");
ViewBag.colors.Add("green");
ViewBag.colors.Add("blue");
ViewBag.ListColors = ListofColors;
return View();
View:
<ul id="colors">
#foreach (var colors in (List<string>) ViewBag.ListColors) {
<li>
#colors
</li>
}
</ul>
The error I get is:CS0103: The name 'colors' does not exist in the current context
You're not passing the ListColors object in to your viewbag, in the controller action:
....
ViewBag.ListColors = ListofColors;
return View();
....
The line is missing in your controller code.
ViewBag.ListColors = colors;
Edit :: The code should be like below in your controller
public ActionResult About()
{
List<string> ListofColors = new List<string>();
ListofColors.Add("red");
ListofColors.Add("green");
ListofColors.Add("blue");
ViewBag.ListColors = ListofColors;
return View();
}
This will fix your issue.
List<string> ListofColors = new List<string>();
ListofColors.Add("red");
ListofColors.Add("green");
ListofColors.Add("blue");
ViewBag.ListColors = ListofColors;
Add Colors To Your List and pass listofcolors to viewbag
Related
this is my Get actionresult :
public ActionResult Add()
{
ViewData["categoryList"]= _categoryRepository.GetAllCategory().
ToSelectList(c => c.Id, c => c.Name);
return View("Add");
}
this my razor that render the categoryList , and I have no trouble with that !
<div>
#Html.LabelFor(b => b.Category)
#Html.DropDownList("Category", ViewData["categoryList"] as IEnumerable<SelectListItem>)
#Html.ValidationMessageFor(b => b.Category)
</div>
finally after submitting the page , category select send via null value to post this action
[HttpPost]
public ActionResult Add(BlogPost blogPost)
{
if (ModelState.IsValid)
{
blogPost.PublishDate = DateTime.Now;
_blogPostRepository.AddPost(blogPost);
_blogPostRepository.Save();
return RedirectToAction("Add");
}
return new HttpNotFoundResult("An Error Accoured while requesting your order!");
}
could anybody tell me why ??
controller
public ActionResult Add()
{
ViewBag.CategoryList = new SelectList(_categoryRepository.GetAllCategory(), "Id", "Name");
// you dont need the specify View name
// like this: return View("Add")
// you need to pass your model.
return View(new BlogPost());
}
view
#Html.DropDownListFor(model => model.CategoryId, ViewBag.CategoryList as SelectList, "--- Select Category ---", new { #class = "some_class" })
controller post action
[HttpPost]
public ActionResult Add(BlogPost blogPost)
{
if (ModelState.IsValid)
{
blogPost.PublishDate = DateTime.Now;
_blogPostRepository.AddPost(blogPost);
_blogPostRepository.Save();
// if you want to return "Add" page you should
// initialize your viewbag and create model instance again
ViewBag.CategoryList = new SelectList(_categoryRepository.GetAllCategory(), "Id", "Name");
return View(new BlogPost());
}
return new HttpNotFoundResult("An Error Accoured while requesting your order!");
}
I want to add another dropdownlist. The below code works for one dropdown, but how would I add one for Categories?
public ActionResult Create()
{
var ddl = new Users();
ddl.DropDowns = userRepository.Getddl("Departments").Select(c => new SelectListItem
{
Value = c.DropdownID.ToString(),
Text = c.DropdownText
});
ViewData["ListofProfiles"] = new SelectList(ListofProfiles, "Value", "Text");
return View(ddl);
}
Try to avoid the ViewData approach.Switch to Strongly typed way of doing this. Add another property to your View Model to carry one more dropdown items
public class User
{
public int SelectedCountry { set;get;}
public int SelectedProfile { set;get;}
public List<SelectListItem> Countries {set;get;}
public List<SelectListItem> Profiles {set;get;}
public User()
{
Countries =new List<SelectListItem>();
Profiles =new List<SelectListItem>();
}
}
Now set the collection in your GET action
public ActionResult Create()
{
var vm=new User();
vm.Countries=GetCountryItems();
vm.Profiles=GetProfileItems();
return View(vm);
}
Where GetCountryItems and GetProfileItems are 2 methods which returns a list of SelectListItem objects for countries and Profiles from db.
Do not make your controllers FAT. Just keep it simple and clean. Move away your code which fetch data from repository to a different layer. Easy to read and maintain :)
And in your strongly typed view,
#mode User
#using(Html.BeginForm())
{
#Html.DropDownListFor(m => m.SelectedCountry,
new SelectList(Model.Countries, "Value", "Text"), "Select")
#Html.DropDownListFor(m => m.SelectedProfile,
new SelectList(Model.Profiles, "Value", "Text"), "Select")
<input type="submit" />
}
I have a generic list method that returns a CategoryID and CategoryName.
I have spent enough time researching and cant seem to put it together. I very new at MVC.
Here is my DropdownList Method in a repository. I get back the data... So far so good.
public List<DropdownList> GetDDl()
{
return catDDL;
}
Here is my CONTROLLER CODE(attempt at it)
IEnumerable<SelectListItem> liCat =
userRepository.Getddl().Select(c => new SelectListItem
{
Value = c.DropDownID.ToString(),
Text = c.DropDownText
}
ViewBag.catItems = new SelecList(liCat,"Value","Text");
Here is my VIEW
#Html.Dropdownlist("catItems","Select Category)
Try to avoid dynamic stuff like ViewBag and ViewData. Use strongly typed views.
ViewModel is just a POCO class which we will use to transfer data between your view and the action method. It will be specific to the view.
ex : if you want to create a view which creates a product. So create a viewmodel like this
public class Product
{
public string Name { set;get;}
public IEnumerable<SelectListItem> Categories{ get; set; }
public string SelectedCategoryId { get; set; }
//Other Properties as needed
}
now in your GET action method, you create an object of this view model and initialize the values and send to the view.
public ActionResult Create()
{
var vm=new Product();
vm.Categories=userRepository.Getddl().
Select(c => new SelectListItem
{
Value = c.DropDownID.ToString(),
Text = c.DropDownText
});
return View(vm);
}
Now make your view strongly typed to our Product class and use the Html.DropDownListFor helper method.
#model PersonsProduct
#using (Html.BeginForm())
{
#Html.DropDownListFor(x => x.SelectedCategoryId,
new SelectList(Model.Categories,"Value","Text"), "Select")
<input type="submit" value="save" />
}
Now in your HttpPost , you can get the form values like this
[HttpPost]
public ActionResult Create(Product model)
{
if(ModelState.IsValid)
{
//check model.SelectedCategoryId
//save and redirect
}
//to do :reload the dropdown again.
return view(model);
}
Should just be:
Controller:
IEnumerable<SelectListItem> liCat = userRepository.Getddl().Select(c => new SelectListItem
{
Value = c.DropDownID.ToString(),
Text = c.DropDownText
}
ViewBag.catItems = liCat
View:
#Html.Dropdownlist("catItems", ViewBag.catItems)
I'm trying to get the drop down list to have my item selected when there is an item, but it never does. I've Googled this and tried many different methods, but they all seem to use a ViewModel containing the list instead of using ViewBag, but I would like to stick to the ViewBag if possible.
My controller:
[HttpGet]
public ActionResult Index(int? id)
{
ViewBag.SelectList = new SelectList(rep.GetItemList(), "id", "type");
if (id.HasValue)
{
var model = rep.GetItemByID(id.Value);
if ( model != null )
{
return View(model);
}
}
return View();
}
My View:
<div class="editor-field">
#Html.DropDownListFor(model => model.itemID, (SelectList)ViewBag.SelectList)
#Html.ValidationMessageFor(model => model.itemID)
</div>
This doesn't have my item selected in the DropDownList, and I've also tried having a list in the ViewBag and then constructing the SelectList in the View, which some posts say should solve the problem:
<div class="editor-field">
#Html.DropDownListFor(model => model.itemID, new SelectList(ViewBag.SelectList, "id", "type", Model.itemID))
#Html.ValidationMessageFor(model => model.itemID)
</div>
But none of it seems to work. So I was wondering if there is anyone where that is able to spot what I'm doing wrong?
make sure your itemID property is set in the model you are passing to the view
if (id.HasValue)
{
var model = rep.GetItemByID(id.Value);
model.itemID=id.Value;
return View(model);
}
I would try setting the selected value from the begining since SelectList is immutable.
[HttpGet]
public ActionResult Index(int? id)
{
if (id.HasValue)
{
ViewBag.SelectList = new SelectList(rep.GetItemList(), "id", "type", id );
var model = rep.GetItemByID(id.Value);
if ( model != null )
{
return View(model);
}
}
else
{
ViewBag.SelectList = new SelectList(rep.GetItemList(), "id", "type");
}
return View();
}
In your View use it like this:
#Html.DropDownListFor(model => model.itemID, (SelectList)ViewBag.SelectList, "Please select...")
Edit: I've changed my question and code to clarify my question better
I've got this (strongly typed view) that does use the values provided in the controller for that specific model
I want to add something to a Model from another model, after posting back from my httpPost action nothing happens...
Thanks in advance!
--------------------------------------other code to clarify my question a bit more----
public class Address
{
public int Id { get; set;}
public String Name { get; set;}
}
public class OtherAddress
{
public int Id { get; set;}
public String Name { get; set;}
public String City { get; set;}
}
public class MasterModel
{
public Address Address { get; set;}
public List<OtherAddress> OtherAddressess { get; set;}
}
public ActionResult Create()
{
MasterModel Model = new MasterModel();
Model.Person = new Person();
Model.Address = new Address();
Model.OtherAdressess = new List<OtherAddress>();
DBContext _db = new DBContext();
Model.OtherAdressess = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
return View(Model);
}
in the view
#model Project.Models.MasterModel
List<SelectListItems> items = new List<SelectListItems>();
foreach(var a in Model.OtherAddressess)
{
SelectListItem item = new SelectListItem();
item.Value = a.Id.toString();
item.Text = a.Street;
}
#using (#Html.BeginForm())
{
<div>
<select name="otheraddress">
foreach(var i in Items)
{
<option value=#i.Value>#i.Text</option>
}
</select>
<input type="submit" name="select" value="Select Address"/>
</div>
<div>
#Html.EditorFor(model => Model.Address.Name)
<div>
<p>
<input type="submit" value="Submit"/>
</p>
}
in post
[HttpPost]
public ActionResult Create(MasterModel Model)
{
String otherAddressSelected = Request.Params["select"];
if(!String.IsNullOrEmpty(otherAddressSelected))
{
int id = int.Parse(Request.Params["otheraddress"]);
DBContext _db = new DBContext();
OtherAddress oa = _db.OtherAddress.Single(oa=> oa.Id == id);
Model.Address.Name = oa.Name;
return View(Model);
}
//other stuff here
}
If you want to change the value of your model in a [HttpPost] controller you have to remove the modelstate for the instance/attribute that you want to change. For example:
[HttpPost]
public ActionResult Index(SomeModel model)
{
ModelState.Remove("Name");
model.Name = "some new name";
return View(model);
}
Got the answer from this example
I would create action method called details that would accept person id as parameter:
public ActionResult Details(int id)
{
// Get person and display
}
Your Create action method is for creating Person type objects, and not displaying their details. So logically what you are doing doesn't seem right to me.
There should be action method to display view for creating a person and equivalent HTTP action method for persisting it into the database.
I would then re-direct to an action method for displaying Person type object information.
return RedirectToAction("Details", new { id = Person.Id });
The input helpers in asp.net mvc will use the post values if they can find any before looking at the model.
In this situation here I think the problem is that you are trying to do more then one thing in the Create POST action. A action (as with any method in the application) should only do one thing. In your case I would do something like this (if I understand the work flow correctly that is):
//Action: SelectAddress
public ActionResult SelectAddress() {
var addresses = _db.OtherAddressess.Where(a=> a.City == "Amsterdam");
return View(new SelectAddressViewModel(addresses));
}
//View SelectAddress
....
<ul>
#foreach(var address in Model.Addresses) {
<li>
<a href="#Url.Action("Create", "Product", new { addressId = address.Id })">
#Model.Name
</a>
</li>
}
</ul>
....
//Action Create
public ActionResult Create(int addressId) {
var address = _db.OtherAddress.Single(oa=> oa.Id == addressId);
var Model = new MasterModel();
Model.Person = new Person();
Model.Address = new Address {
Name = address.Name
}
return View(Model);
}