TL; DR: Попробуйте использовать Html.Partial
вместо Renderpage
Я получал Object reference not set to an instance of an object
, когда пытался сделать вид в представлении, отправив ему модель, например это:
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
И это сработало.
Кроме того, причина, по которой я не имел Html.Partial
для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach
, хотя это не ошибка:
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach
, чтобы выглядеть так:
@foreach(var M in MyEntities){
...
}
Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .
Нет таких вещей, как «безопасные» или «небезопасные» значения как таковые. Существуют только значения, которые сервер контролирует и значения, которые пользователь контролирует, и вам нужно знать, откуда приходит значение, и, следовательно, можно ли им доверять в определенной цели. $_SERVER['HTTP_FOOBAR']
, например, полностью безопасно хранить в базе данных, но я, конечно, не хотел бы eval
.
. Итак, разделим эти значения на три категории:
Эти переменные устанавливаются средой сервера и полностью зависят от конфигурации сервера.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Эти переменные зависят от конкретного запроса, отправленного клиентом, но могут принимать только ограниченное количество допустимых значений, поскольку все недопустимые значения должны быть отклонены веб-сервером и не вызвать вызов сценарий для начала. Следовательно, их можно считать надежными .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
* 'REMOTE_HOST'
* 'REMOTE_PORT'
* 'SERVER_PROTOCOL'
'HTTP_HOST'
† 'SERVER_NAME'
† 'SCRIPT_FILENAME'
'SERVER_PORT'
‡ 'SCRIPT_NAME'
* Значения REMOTE_
гарантированно будет действительным адресом клиента, подтвержденным рукопожатием TCP / IP. Это адрес, на который будет отправлен любой ответ. REMOTE_HOST
полагается на обратные запросы DNS, хотя и может быть подделано атаками DNS на ваш сервер (в этом случае у вас есть большие проблемы в любом случае). Это значение может быть прокси-сервером, который является простой реализацией протокола TCP / IP и ничего не может сделать.
† Если ваш веб-сервер отвечает на любой запрос независимо от того, заголовка HOST
, это также должно считаться небезопасным. См. Насколько безопасно $ _SERVER ["HTTP_HOST"]? . Также см. http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ См. https: // bugs .php.net / bug.php? id = 64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http : //httpd.apache.org/docs/2.4/mod/core.html#comment_999
Эти значения не проверяются вообще и не зависят от какой-либо конфигурации сервера, они являются полностью произвольной информацией, отправленной клиентом.
'argv'
, 'argc'
(применимо только к вызову CLI, обычно не относится к веб-серверам ) 'REQUEST_METHOD'
§ 'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖ 'PHP_AUTH_DIGEST'
‖ 'PHP_AUTH_USER'
‖ 'PHP_AUTH_PW'
‖ 'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(может содержать испорченные данные) 'PHP_SELF'
(может содержать испорченные данные) 'PATH_TRANSLATED'
'HTTP_'
§ Может считаться надежным , если веб-сервер допускает только определенные методы запроса.
‖ Может считаться надежным , если аутентификация полностью обрабатывается веб-сервером.
Суперглобал $_SERVER
также включает в себя несколько переменных среды. Являются ли они «безопасными» или не зависят от того, как (и где) они определены. Они могут варьироваться от полностью контролируемого сервера до полностью управляемого пользователем.
В PHP на каждую переменную $_SERVER
, начиная с HTTP_
, может влиять пользователь. Например, переменная $_SERVER['HTTP_REINERS']
может быть испорчена установкой HTTP-заголовка REINERS
произвольным значением в HTTP-запросе.