I've tried to built a Kendo Treeview linked to a List in C# and ASP.NET MVC, but each time I run the Application it displays instead of the List I get a Request Failed error.
My C# code
The Controller:
public JsonResult RetrieveData()
{
var testList = new List<AssetsVM>();
var root = new AssetsVM { id = 1 , name = "Elsman" };
testList.Add(root);
root.Children.Add(new AssetsVM { id = 2, name = "Elsman1" });
root.Children.Add(new AssetsVM { id = 3, name = "Elsman2" });
return Json(testList, JsonRequestBehavior.AllowGet);
}
the List code
The View Model
public class AssetsVM
{
public string name { get; set; }
public long id { get; set; }
public List<AssetsVM> Children { get; set; }
public AssetsVM()
{
this.Children = new List<AssetsVM>();
}
public AssetsVM(tbl_Assets x)
{
this.name = x.Name;
this.id = x.ID;
this.Children = new List<AssetsVM>();
}
public bool HasChildren
{
get { return Children.Any(); }
}
}
The HTML/Kendo Code
The View:
<div class="kendo-tree">
#(Html.Kendo().TreeView()
.Name("treeViewDatabase")
.DataTextField("name")
.DataSource(dataSource => dataSource
.Model(m => m
.Id("id")
.HasChildren("HasChildren")
)
.Read(read => read.Action("RetrieveData", "BeheerController"))
)
//.Events(e => e.Select("Index"))
.HtmlAttributes(new { style = "color:white;"})
)
</div>
Does anyone see the problem why I get a "Request Failed" Error?
Thanks in Advance
PS. The Table is not in use during the code but its already there for preporations
Related
I've tried to get the form input value using model but it throws the following error
enter image description here
The model I've used is
public class RegisterContentModel : ContentModel
{
public RegisterContentModel(IPublishedContent content) : base(content)
{
}
public int id { get; set; }
public string Name { get; set; }
public string Location { get; set; }
}
The View page I,ve used is
#{
Umbraco8_1Entities1 _context = new Umbraco8_1Entities1();
RegisterContentModel model = new RegisterContentModel(IPublishedContent content);
var value = _context.Employees.Where(i => i.ID == model.id)
.Select(i => new { Name = i.Name });
foreach (var item in value)
{
<p>Name : #item.Name</p>
}
}
I'm getting error in the line
RegisterContentModel model = new RegisterContentModel(IPublishedContent content);
What is the solution to get rid of this problem??????????
-Jothipriya
I have problem and still do not understand the concept about Enum in EnumDropDownListFor to bind spesific Existing Enum value.
public class LeaveRequestModel
{
public int LeaveId { get; set; }
public string LeaveCode { get; set; }
public string Reason { get; set; }
public LeaveStatus Status { get; set; }
}
public enum LeaveStatus
{
[Display(Name = "New Request")]
NewRequest = 1,
[Display(Name = "Approved by SPV")]
ApprovedBySpv = 2,
[Display(Name = "Approved by HR")]
ApprovedByHr = 3,
[Display(Name = "Rejected By SPV")]
RejectedBySpv = 4
}
I displayed Enum in My View using EnumDropDownListFor
#Html.EnumDropDownListFor(m => m.Status, "-Please select-", new { #class = "col-sm-10", #required = "required" })
and the result is like this:
My Question is How can I display only specific Enum Value ApprovedBySpv and ApprovedByHr in EnumDropDownListFor with specific condition? If it is possible, how can I do it?
Model:
public class LeaveRequestModel
{
...
public LeaveStatus Status { get; set; }
public SelectList FilteredLeaveStatus {get;set;}
}
Controller:
public ActionResult LeaveRequest()
{
var model = new LeaveRequestModel();
if(condition)
{
var filtered = new[]
{
new SelectListItem{Value = LeaveStatus.ApprovedBySpv, Text = "Rejected By SPV"},
new SelectListItem{Value = LeaveStatus.ApprovedByHr, Text = "Approved by HR"}
};
model.FilteredLeaveStatus = new SelectList(filtered);
}
...
return View(model);
}
View:
#Html.DropDownListFor(m => m.Status, Model.FilteredLeaveStatus, "-Please select-", new { #class = "col-sm-10", #required = "required" })
You can add a method to the class that will take in the values that determine the condition, and only return the relevant enums.
For example, let's say one can only advance the status to a higher status, but not move it back to a lower status. You can add a method that will take the current status and only return statuses with a higher value.
Method (add to LeaveRequestModel class)
public IEnumerable<LeaveStatus> GetAvailableStatuses(){
return Enum.GetValues(typeof(LeaveStatus)).Where(e => e >= Status);
}
View
#Html.EnumDropDownListFor(m => m.LeaveStatus, Model.GetAvailableStatuses().Select(s => new SelectListItem {
Text = s.ToString(),
Value = ((int)s).ToString()
}).ToList(), "-Please select-", new { #class = "col-sm-10", #required = "required" })
Note that I took a guess at what your condition might be, but you can update that in the GetAvailableStatuses method.
I'm developing an ASP.NET MVC 5 application, with C# and .NET Framework 4.6.1.
I have this View:
#model MyProject.Web.API.Models.AggregationLevelConfViewModel
[...]
#Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, (SelectList)Model.HelperCodeTypeItems, new { id = "Configurations[0].HelperCodeType" })
The ViewModel is:
public class AggregationLevelConfViewModel
{
private readonly List<GenericIdNameType> codeTypes;
private readonly List<GenericIdNameType> helperCodeTypes;
public IEnumerable<SelectListItem> CodeTypeItems
{
get { return new SelectList(codeTypes, "Id", "Name"); }
}
public IEnumerable<SelectListItem> HelperCodeTypeItems
{
get { return new SelectList(helperCodeTypes, "Id", "Name"); }
}
public int ProductionOrderId { get; set; }
public string ProductionOrderName { get; set; }
public IList<Models.AggregationLevelConfiguration> Configurations { get; set; }
public AggregationLevelConfViewModel()
{
// Load CodeTypes to show it as a DropDownList
byte[] values = (byte[])Enum.GetValues(typeof(CodeTypes));
codeTypes = new List<GenericIdNameType>();
helperCodeTypes = new List<GenericIdNameType>();
for (int i = 0; i < values.Length; i++)
{
GenericIdNameType cType = new GenericIdNameType()
{
Id = values[i].ToString(),
Name = EnumHelper.GetDescription((CodeTypes)values[i])
};
if (((CodeTypes)values[i]) != CodeTypes.NotUsed)
codeTypes.Add(cType);
helperCodeTypes.Add(cType);
}
}
}
And Models.AggregationLevelConfiguration is:
public class AggregationLevelConfiguration
{
public byte AggregationLevelConfigurationId { get; set; }
public int ProductionOrderId { get; set; }
public string Name { get; set; }
public byte CodeType { get; set; }
public byte HelperCodeType { get; set; }
public int PkgRatio { get; set; }
public int RemainingCodes { get; set; }
}
I need to set selected value in these properties:
public IEnumerable<SelectListItem> CodeTypeItems
{
get { return new SelectList(codeTypes, "Id", "Name"); }
}
public IEnumerable<SelectListItem> HelperCodeTypeItems
{
get { return new SelectList(helperCodeTypes, "Id", "Name"); }
}
But I can't set it in new SelectList(codeTypes, "Id", "Name"); or new SelectList(helperCodeTypes, "Id", "Name"); because the selected value are in Configurations array: fields AggregationLevelConfiguration.CodeType and AggregationLevelConfiguration.HelperCodeType.
I think I have to set selected value in the View, but I don't know how to do it.
How can I set the selected values?
Unfortunately #Html.DropDownListFor() behaves a little differently than other helpers when rendering controls in a loop. This has been previously reported as an issue on CodePlex (not sure if its a bug or just a limitation)
The are 2 option to solve this to ensure the correct option is selected based on the model property
Option 1 (using an EditorTemplate)
Create a custom EditorTemplate for the type in the collection. Create a partial in /Views/Shared/EditorTemplates/AggregationLevelConfiguration.cshtml (note the name must match the name of the type
#model yourAssembly.AggregationLevelConfiguration
#Html.DropDownListFor(m => m.HelperCodeType, (SelectList)ViewData["CodeTypeItems"])
.... // other properties of AggregationLevelConfiguration
and then in the main view, pass the SelectList to the EditorTemplate as additionalViewData
#using (Html.BeginForm())
{
...
#Html.EditorFor(m => m.Configurations , new { CodeTypeItems = Model.CodeTypeItems })
...
Option 2 (generate a new SelectList in each iteration and set the selectedValue)
In this option your property CodeTypeItems should to be IEnumerable<GenericIdNameType>, not a SelectList (or just make codeTypes a public property). Then in the main view
#Html.DropDownListFor(m => m.Configurations[0].HelperCodeType, new SelectList(Model.CodeTypeItems, "Id", "Name", Model.Configurations[0].HelperCodeType)
Side note: there is no need to use new { id = "Configurations[0].HelperCodeType" - the DropDownListFor() method already generated that id attribute
I wrote this class to overcome an issue I was having with selecting an option in an html select list. I hope it helps someone.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
namespace Login_page.Models
{
public class HTMLSelect
{
public string id { get; set; }
public IEnumerable<string> #class { get; set; }
public string name { get; set; }
public Boolean required { get; set; }
public string size { get; set; }
public IEnumerable<SelectOption> SelectOptions { get; set; }
public HTMLSelect(IEnumerable<SelectOption> options)
{
}
public HTMLSelect(string id, string name)
{
this.id = id;
this.name = name;
}
public HTMLSelect(string id, string name, bool required, IEnumerable<SelectOption> options)
{
this.id = id;
this.name = name;
this.required = required;
}
private string BuildOpeningTag()
{
StringBuilder text = new StringBuilder();
text.Append("<select");
text.Append(this.id != null ? " id=" + '"' + this.id + '"' : "");
text.Append(this.name != null ? " name=" + '"' + this.name + '"' : "");
text.Append(">");
return text.ToString();
}
public string GenerateSelect(IEnumerable<SelectOption> options)
{
StringBuilder selectElement = new StringBuilder();
selectElement.Append(this.BuildOpeningTag());
foreach (SelectOption option in options)
{
StringBuilder text = new StringBuilder();
text.Append("\t");
text.Append("<option value=" + '"' + option.Value + '"');
text.Append(option.Selected != false ? " selected=" + '"' + "selected" + '"' + ">" : ">");
text.Append(option.Text);
text.Append("</option>");
selectElement.Append(text.ToString());
}
selectElement.Append("</select");
return selectElement.ToString();
}
}
public class SelectOption
{
public string Text { get; set; }
public Boolean Selected { get; set; }
public string Value { get; set; }
}
}
And
public IEnumerable<SelectOption> getOrderTypes()
{
List<SelectOption> orderTypes = new List<SelectOption>();
if (this.orderType == "OptionText")
{
orderTypes.Add(new SelectOption() { Value = "1", Text = "OptionText", Selected = true });
} else
{
orderTypes.Add(new SelectOption() { Value = "2", Text = "OptionText2" });
}
}
And to use it:
#{
Login_page.Models.HTMLSelect selectElement = new Login_page.Models.HTMLSelect("order-types", "order-types");
}
#Html.Raw(selectElement.GenerateSelect(Model.getOrderTypes()));
I leave this in case it helps someone else. I had a very similar problem and none of the answers helped.
We had in a view this line at the top:
IEnumerable<SelectListItem> exitFromTrustDeed = (ViewData["ExitFromTrustDeed"] as IEnumerable<string>).Select(e => new SelectListItem() {
Value = e,
Text = e,
Selected = Model.ExitFromTrustDeed == e
});
and then below in the view:
#Html.DropDownListFor(m => m.ExitFromTrustDeed, exitFromTrustDeed, new { #class = "form-control" })
We had a property in my ViewData with the same name as the selector for the lambda expression and for some reason that makes the dropdown to be rendered without any option selected.
We changed the name in ViewData to ViewData["ExitFromTrustDeed2"] and that made it work as expected.
Weird though.
Firstly I'm using MVC 2.0. I am having trouble getting a selection with a Multiselect listbox on the postback to my controller. Here is my Code:
Model
public class TestModel
{
public MultiSelectList AvailableTestTypes { get; set; }
public List<TestType> SelectedTestTypes { get; set; }
}
public class TestType
{
public long Id { get; set; }
public string Name { get; set; }
public bool isActive { get; set; }
}
Controller
public ActionResult Index(TestModel model)
{
if (model == null) model = new TestModel();
List<TestType> testList = new List<TestType>()
{
new TestType() { Id = 1, Name = "TESTING", isActive = true },
new TestType() { Id = 2, Name = "TESTING2", isActive = true },
new TestType() { Id = 3, Name = "TESTING3", isActive = true }
};
model.AvailableTestTypes = testList; //TODO: Fetch From Repository
return View(model);
}
[HttpPost]
public ActionResult PostForm(TestModel model)
{
List<long> act = model.SelectedTestTypes != null ? model.SelectedTestTypes.Select(x => x.Id).ToList() : new List<long>();
View
<%= Model != null && Model.AvailableTestTypes != null ?
Html.ListBoxFor(x => x.SelectedTestTypes,
new MultiSelectList(Model.AvailableTestTypes, "Id", "Name", Model.SelectedTestTypes),
new { #id = "testListboxId", #class = "blah", #title = "title" }) : null%>
After the Post to the Controller my Selected List count is 0 no matter how many I choose...
What am I getting wrong here?
I tried a few different solutions such as
Challenges with selecting values in ListBoxFor
but nothing worked :(
The difference between your script and the example in the other script, is the fact that you're trying to bind to a List, instead of a int[].
When you want to populate a Multiselect Listbox, you will have to set a DataValueField and a DataTextfield, otherwise no value is set.
model.AvailableTestTypes = new MultiSelectList(testList, "Id", "Name);
Then try using this class:
public class TestModel
{
public MultiSelectList AvailableTestTypes { get; set; }
public int[] SelectedTestTypes { get; set; }
}
In your PostForm action, you can use the Ids to retrieve the TestTypes.
Having a hard time getting this dropDownList to Bind. This is simply a list of states. The Model.State is "TX", but my dropdownlist is showing "AK", which is the first value in the list. Any thoughts?
<%: Html.DropDownListFor(
model => model.State,
new SelectList(
muniSynd.getStatecodesDropDown(),
"Value",
"Text",
Model.State.ToString().Trim()
)
)
%>
In my muniSynd class, which is a wrapper of my dataContext.....
public IList<StateCodeViewModel> getStatecodesDropDown()
{
var states = from p in this._MuniDc.Statecodes
select new StateCodeViewModel
{
Value = p.Statecode1.ToString().Trim(),
Text = p.Statecode1.ToString().Trim()
};
return states.ToList();
}
public class StateCodeViewModel
{
public string Value{get;set;}
public string Text{get;set;}
}
Im using LinqToSQL, here is the object
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.Statecodes")]
public partial class Statecode
{
private string _Statecode1;
public Statecode()
{
}
[global::System.Data.Linq.Mapping.ColumnAttribute(Name="Statecode", Storage="_Statecode1", DbType="NVarChar(3)")]
public string Statecode1
{
get
{
return this._Statecode1;
}
set
{
if ((this._Statecode1 != value))
{
this._Statecode1 = value;
}
}
}
}
I've tried to replicate your problem, but my example below works fine:
public class HomeController : Controller
{
public ActionResult Index()
{
var viewModel = new IndexViewModel();
viewModel.State = "TX";
return this.View(viewModel);
}
public static IList<StateCodeViewModel> getStatecodesDropDown()
{
var stateCodes = new List<string> { "AX", "GH", "TX" };
var states = from p in stateCodes
select new StateCodeViewModel
{
Value = p,
Text = p
};
return states.ToList();
}
}
public class IndexViewModel
{
public string State { get; set; }
}
public class StateCodeViewModel
{
public string Value { get; set; }
public string Text { get; set; }
}
View
#using MVCWorkbench.Controllers
#model IndexViewModel
#{
ViewBag.Title = "title";
}
#Html.DropDownListFor(model => model.State,
new SelectList(HomeController.getStatecodesDropDown(),
"Value",
"Text",
Model.State.ToString().Trim()
)
)
Not sure what to suggest other then check that the State value is in the dropdown list. Also this could be a case-sensitivity issue perhaps?