Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. http://example.com/Issue/Open?sort=ID&filter=foo
public ActionResult Open(string sort, string filter)
платформа MVC заполнит аргументы от параметров строки запроса. Удостоверьтесь и используйте nullable типы (как строка) для любого из этих аргументов параметра строки запроса, которые не могли бы быть заполнены в.
я на самом деле думаю, что это - "более корректный" способ записать URL. Сам URL определяет ресурс (нерешенные вопросы); параметры строки запроса настраивают, как отобразить ресурс.
До количества запросов идут, помнят, что Вы не должны создавать весь запрос сразу. Можно использовать.OrderBy дополнительный метод для переупорядочивания существующего IQueryable< T> и так же с.Where.
var Issues = from i in db.Issues where i.Status == "Open" select i;
switch (sort)
{
case "ID":
Issues = Issues.OrderBy(i => i.ID);
break;
// [...]
default:
Issues = Issues.OrderBy(i => i.TimeLogged);
}
Если Вы ожидаете arbitary количество параметров, Вы могли бы сделать что-то вроде этого.
public ActionResult Open(){
string[] keys = Request.QueryString.AllKeys;
Dictionary queryParams = new Dictionary();
foreach (string key in keys)
{
queryParams[key] = Request.QueryString[key];
}
string sort = queryParams["sort"];
...
Это должен быть комментарий к ответу kimsks, но по какой-то причине комментарии требуют, чтобы я прошел проверку, поэтому я должен опубликовать его не в том месте.
Лучший способ справиться с произвольное количество параметров строки запроса - использовать ActionFilter
следующим образом:
public class QueryStringFilterAttribute : ActionFilterAttribute
{
public string ParameterName { get; private set; }
public QueryStringFilterAttribute(string parameterName)
{
if(string.IsNullOrEmpty(parameterName))
throw new ArgumentException("ParameterName is required.");
ParameterName = parameterName;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var qs = new FormCollection(filterContext.HttpContext.Request.QueryString);
filterContext.ActionParameters[ParameterName] = qs;
base.OnActionExecuting(filterContext);
}
}
Теперь вы можете добавить атрибут к своему действию, например, [QueryStringFilter («attributes»)]
и он будет передавать значения строки запроса как FormCollection
. Таким образом, ваше действие будет легче проверить, поскольку оно больше не зависит от синглтона Request
.